2012-06-17 49 views
14

我有4个文件(2个头文件和2个代码文件)。 FileA.cpp,FileA.h,FileB.cpp,FileB.hC++变量的多重定义

FileA.cpp:

#include "FileA.h" 

int main() 
{ 
    hello(); 
    return 0; 
} 

void hello() 
{ 
    //code here 
} 

FileA.h:

#ifndef FILEA_H_ 
#define FILEA_H_ 
#include "FileB.h" 
void hello(); 

#endif /* FILEA_H_ */ 

FileB.cpp:

#include "FileB.h" 

void world() 
{ 
    //more code; 
} 

FileB.h:

#ifndef FILEB_H_ 
#define FILEB_H_ 

int wat; 
void world(); 


#endif /* FILEB_H_ */ 

当我尝试编译(与eclipse)时,我得到了“wat'的多重定义” 我不知道为什么,它似乎应该工作得很好。

+4

欢迎连接的世界.. –

回答

22

我不会包括所有的细节,但你在你的编译UINT定义一个全局变量,wat两次。

要修复,使用下列:

FileB.h

extern int wat; 

FileB.cpp

int wat = 0; 

这(extern)告诉编译该变量wat存在某处,它需要找到它自己的(在这种情况下,它在FileB.cpp

+0

这会影响对'const'变量的优化?编译器优化是在编译阶段还是链接阶段运行? – ar2015

0

那个wat变量声明是一个应该属于一个cpp文件的定义。就好像你会将你的函数体放入标题中一样。

您需要在wat声明之前放置extern,并将不带extern的当前声明复制到其中一个cpp文件中。

3

您得到多个定义,因为wat在文件范围内声明,并且在两个源文件中可以看到两次。

取而代之,使变量声明extern,并确切地在中定义一个源文件。

extern int wat; // In FileB.h 

int wat; // In FileB.cpp 
1

我现在找到了答案(我猜看文件一个接一个帮助) 问题是,编译器创建一个具有wat定义的FileB.o,然后它试图用FileA.cpp编译FilB.o,而FileA.h包含FileB.h,它现在也将具有wat的定义。

+0

我只有一个单一的blabla.h文件,并且包含守卫(#ifndef xxx_H ...)和一个全局变量。在编译时,我得到了'myglobal_variable'错误的多重定义。 –

6

不要在头中声明变量。 #include从字面上将文件的内容复制并粘贴到另一个文件中(也就是说,#include "FileB.h"将从字面上将FileB.h的内容复制到该文件中,这意味着在执行#include "FileB.h"的每个文件中都定义了int wat)。

如果要从FileA.cpp访问wat,并且它在FileB.cpp中声明,则可以在FileA.cpp中将其标记为extern