2016-04-04 92 views
-3

我在使用C++包含文件時遇到了一些問題。錯誤的文件包含在C++中

record.hpp

#ifndef record_hpp 
#define record_hpp 

#include <stdio.h> 

class record { 
...... 
}; 

#endif /* record_hpp */ 

node.hpp

#ifndef node_hpp 
#define node_hpp 

#include <stdio.h> 

#include <string.h> 
#include "record.hpp" 


class recordNode: public record { 
...... }; 
#endif /* node_hpp */ 

List.hpp

#ifndef List_hpp 
#define List_hpp 


#include <stdio.h> 
#include "node.hpp" 

class List 
{.........}; 

#endif /* List_hpp */ 

node2.hpp

#ifndef node_hpp 
#define node_hpp 

#include "List.hpp" 
#include "node.hpp" 
#include <stdio.h> 

#define N 5 


class node { 
private: 

    List **key; 
public: 
    recordNode *k; 
}; 

而在最後一個文件我有很多的問題。編譯器不知道它是什麼List結構和recordNode。我不知道如何解決它。

+0

'node.hpp'和'node2.hpp'都使用'#ifndef node_hpp',這會讓事情混淆不清,而'node2.hpp'中沒有'#endif'。此外,請複製並粘貼您正在收到的確切編譯器錯誤。 –

+0

我只是忘了寫_italic_ ** bold **'#endif'。我用這個編譯器。 xCode說'未知類型列表'未知類型node2' –

回答

2

在你node.hpp您有以下頂部定義:在你的node2.hpp還具有以下頂部定義

#ifndef node_hpp 
#define node_hpp 

#ifndef node_hpp 
#define node_hpp 

我建議改變node2.hpp

#ifndef node2_hpp 
#define node2_hpp 

或類似的東西,並添加

#endif /* node2_hpp */ 

到文件的末尾。

2

這東西

#ifndef record_hpp 
#define record_hpp 


#endif /* record_hpp */ 

被稱爲Include Guard。它可以防止被包含的文件被重複包含,並可能釋放遞歸地獄和重複的定義在你可憐的毫無疑問的程序上。

考慮類似string這幾乎包括所有的東西。沒有後衛,你可以定義數百次std::string。至少這會減慢編譯速度。最糟糕的是真正奇怪的事情發生,你花幾個小時或幾天的調試。

的邏輯是這樣的:

如果我們還沒有看到record_hpp(#ifndef record_hpp),將其標記爲可見(#define record_hpp)和文件中的所有內容複製到包括文件到後衛的末尾( #endif /* record_hpp */

在node.hpp中,守衛叫做node_hpp。節點2使用相同的名稱。HPP,所以

#ifndef node_hpp 
#define node_hpp 

#include "List.hpp" 
#include "node.hpp" 
#include <stdio.h> 

#define N 5 


class node { 
private: 

    List **key; 
public: 
    recordNode *k; 
}; 

將擴大到

#ifndef node_hpp 
#define node_hpp 

#include "List.hpp" 
#ifndef node_hpp 
#define node_hpp 

#include <stdio.h> 

#include <string.h> 
#include "record.hpp" 


class recordNode: public record { 
...... }; 
#endif /* node_hpp */ 
#include <stdio.h> 

#define N 5 


class node { 
private: 

    List **key; 
public: 
    recordNode *k; 
}; 

它,因爲我們已經看到node_hpp,由node_hpp把守的第二塊將被忽略,node2.hpp將成爲

#ifndef node_hpp 
#define node_hpp 

#include "List.hpp" 
#ifndef node_hpp 
#endif /* node_hpp */ 
#include <stdio.h> 

#define N 5 


class node { 
private: 

    List **key; 
public: 
    recordNode *k; 
}; 

因此,從未定義recordNode。糟糕!

外賣是從不重複包括警衛。

另請注意,node2.hpp末尾沒有#endif關閉包含防護。以後也會造成一些醜陋。

解決方案:

#ifndef node2_hpp 
#define node2_hpp 

#include "List.hpp" 
#include "node.hpp" 
#include <stdio.h> 

#define N 5 


class node { 
private: 

    List **key; 
public: 
    recordNode *k; 
}; 
#endif /* node2_hpp */ 

更復雜的項目將需要更復雜的包括後衛的名字,因爲它是非常可能的,你可以有兩個「list.hpp」 S,一個在你的代碼,另一個在第三者圖書館。

+0

感謝您的幫助。它解決了這個問題) –