2010-11-10 59 views
1

之前我有點問這個問題,但是我使用了我被告知的嘗試讓我的程序工作:多個類中使用的函數

這可能是因爲我是C++的菜鳥,但由於我的問題我使用#ifndef時遇到了麻煩類包含相同的.h文件。 sh和th以及main.cpp需要在rh

中定義的結構我在我的主cpp文件

中有

#include "s.h" 
#include "t.h" 

#ifndef r 
#include "r.h" 
#endlif 

並且在我的每個sh和th文件中都有一個

#ifndef r 
#include "r.h" 
#endlif 
// and then its class 

以及編譯器在rh文件中給出了關於expected nested-name-specifier before "namespace"unqualified id before using namespace std;expected ';' before "namespace"的錯誤,即使我在rh文件中的所有內容都是:

#include <iostream> 

using namespace std; 
struct r{ 
// code 
}; 

是由問題引起的main cpp沒有導入某些庫或其他東西?我如何解決它?

+1

什麼是'#endlif'?你的意思是'#endif' – Chubsdad 2010-11-10 03:01:21

回答

4

#ifndef需要進入頭文件以防止多次包含它。所以,你會S.H這個樣子:

#ifndef S_H 
#define S_H 

// All of your s.h declarations go here 

#endif

R.H會是這個樣子:

#ifndef R_H 
#define R_H 

// All of your r.h declarations go here 

#endif

等。

這可以防止頭文件被多次包含。如果多次在單個編譯單元中包含相同的頭文件,編譯器可能會抱怨同一個符號被多次聲明。如果遞歸地包括相同的標題集合,它在編譯期間也可能潛在地導致無限循環。

+2

如果你這樣做,你不需要'#include'周圍的'#if'塊。 – 2010-11-10 03:22:03

0

我希望你使用r,s和t來簡化你的問題。

是否有可能您認爲具有「struct r」語句的語句DEFINES r用於您的程序?

這些是兩種不同的定義。一個是結構的定義,但要使用一個定義:

#ifndef R_H 
#define R_H 
#include <iostream> 

using namespace std; 

struct r{ 
//code 
}; 

#endif 

(如andand已經指出的那樣)

注:我使用的定義R_H而不是R軟,以避免混亂。你想在結構中使用r,在你的頭文件中使用R_H作爲你的定義(呃,實際上是模塊的名字+「_H」)。

0

編譯指令如#include#ifdef是「C預處理器」的一部分,它實際上是與C不同的編程語言。因此預處理器不會看到您的struct r。你需要像這樣在你R.H:

#include <iostream> 
#define r 
using namespace std; 
struct something_that_isnt_called_just_r{ 
// code 
}; 

這就是爲什麼你最好還是採用傳統的包括@andand描述警衛。

相關問題