2012-08-26 22 views
2

我工作的一個項目,我需要的結構如下: enter image description here如何使用的#ifndef的#define #ENDIF正確的C++

的2個CPP文件包含類,這些類必須是在赤裸裸的功能H文件1.類和nakeds需要H文件2中的變量。

我可以拆分CPP文件,以便它們使用2個單獨的文件,它們包含海綿和它們需要的變量。但我更喜歡使用這種結構。

它看起來像編譯器跳過的#ifndef命令,我提出該問題的測試:

主要:

#include <iostream> 

//1>CPPFile2.obj : error LNK2005: "bool Test1" ([email protected]@3_NA) already defined in CPPFile1.obj 
//1>CPPFile2.obj : error LNK2005: "bool Test2" ([email protected]@3_NA) already defined in CPPFile1.obj 

int main() 
{ 
} 

CPPFile 1:

#include <iostream> 
using namespace std; 

#include "HFile1.h" 

CPPFile 2:

#include <iostream> 
using namespace std; 

#include "HFile2.h" 

HFILE 1:

#include "HFile2.h" 

#pragma once 
#ifndef Name1 
#define Name1 

//Use test1, this workes fine 
//Use test2, this workes fine 

#endif 

HFILE 2:

#pragma once 
#ifndef Name2 
#define Name2 

bool Test1 = false; 
bool Test2 = false; 

#endif 

這怎麼可能是的#ifndef的#define #ENDIF結構不能正常工作?

+2

通常你不會需要將這些包括警衛,因爲你已經有#pragma一次。 –

+0

我在#pragma一次不支持的情況下添加了它們,但沒有2中的其中一個仍不起作用。 – Laurence

+1

您違反了一個定義規則。您需要使'Test1'和'Test2'爲'static'或'extern'。 – jrok

回答

6

您的問題是,第二個標題是定義了的變量,而不僅僅是聲明瞭他們。程序中必須有一個單獨的定義,因此編譯失敗。這與包含警衛無關,因爲警衛只在一個翻譯單位內保護。在你的情況下,每個.cpp文件都包含頭文件,因此可以分別定義相同的變量。

的解決辦法是隻在頭聲明變量,並在翻譯單元定義它們:

#ifndef Name2 
#define Name2 
extern bool Test1; 
extern bool Test2; 
#endif 
// single .cpp 
bool Test1 = false; 
bool Test2 = false; 

雖然周圍的整個事情的一些代碼味道。您可能需要重新設計您的解決方案。全局變量的使用在大多數情況下不是一個好的解決方案。

3

你會得到一個鏈接錯誤;這與包括警衛無關。您已在兩個目標文件中定義了Test1Test2。相反,你需要確保只有一個目標文件定義了它和其他的extern它。

1

不要在標題定義一個變量..你應該在一個.cpp定義它,然後,如果你想從另一個.cpp文件訪問它創建於它的extern「的標題。

File1.cpp

bool Test1 = false; //define a var in your .cpp 

文件1。^ h

extern bool Test1; //extern it in your header 

File2.cpp

#include "File1.h" //include the header of the variable 

void Somefunction() 
{ 
    if (Test1) //use the variable 
    { 
    //someting 
    } 

} 

但是它通常是一個不好的做法,使用全局變量...

相關問題