2012-04-13 94 views
3

我试图使用从分离.cpp文件的全局变量我有一个init.h里文件:LNK2005:“已经定义的错误

//init.h 
#ifndef init 
#define init 
int a = 3; 
#endif 

我有一个init.cpp文件: //init.cpp #include init.h

于是最后我的main.cpp文件是:

//main.cpp 
#include "init.h" 
int main(void) 
{ 
    while(1) 
    { 
    } 
} 

在此之后,我得到的错误:

1>init.obj : error LNK2005: "int a" ([email protected]@3HA) already defined in main.obj 
1> ..deneme.exe : fatal error LNK1169: one or more multiply defined symbols found 

为什么我的#infdef控件不能解决这个问题?我也尝试使用#pragma once,但我得到了同样的错误。我的代码有什么问题?

回答

9

您需要将变量标记为extern,并在实现文件中仅定义一次。

由于代码是现在,你打破了一个定义规则。在这种情况下,包含守卫不起作用,因为包含该头文件的所有翻译单元都会重新定义变量。

你真正需要:

//init.h 
#ifndef init 
#define init 
extern int a; 
#endif 

和定义:

//init.cpp 
#include "init.h" 
int a = 3; 

此外,三思使用全局之前。你究竟在努力实现什么?

+0

好吧,我忘了写包含init.h文件的init.cpp文件。当我使用extern时问题仍然存在。 – 2012-04-13 12:44:45

+1

@volkansezer不可能是正确的。你确定你没有忘记从标题中删除= 3吗?你确定你在头文件中声明它为extern而不是实现文件吗? – 2012-04-13 13:02:57

+0

是的,你是对的,我已经改变了你的建议和问题解决,非常感谢。再次感谢我从不同的源文件实现同样的全局变量对我来说非常重要。 – 2012-04-13 23:37:09

相关问题