C++ 链接器在头文件中为全局变量提供错误的原因
我在header.h中声明了一个全局变量,并在source.cpp和main.cpp中包含了该header,但链接器给出了错误消息C++ 链接器在头文件中为全局变量提供错误的原因,c++,linker,extern,C++,Linker,Extern,我在header.h中声明了一个全局变量,并在source.cpp和main.cpp中包含了该header,但链接器给出了错误消息 Source.obj : error LNK2005: "int globalVariable" (?globalVariable@@3HA) already defined in Main.obj GlobalVariableAndLinkageIssue.exe fatal error LNK1169: one or more multiply defi
Source.obj : error LNK2005: "int globalVariable" (?globalVariable@@3HA) already defined in Main.obj
GlobalVariableAndLinkageIssue.exe fatal error LNK1169: one or more multiply defined symbols found
标题.h
source.cpp
main.cpp
要创建全局变量,应执行以下操作。注意,在标题中,我们将变量标记为
extern
,实际上我们在cpp
文件中创建了对象
标题.h
header.cpp
main.cpp
因为两个源都包含您的标题,因此它被定义了两次
extern int globalVariable;//标题中的声明-可以有您需要的数量
但.cpp文件应具有以下定义:
int globalVariable;//.cpp中的定义-在所有文件中只需要一个定义
C和C++使用文本预处理器来包括标题,这基本上是文本插入,而不是一些语言中的智能模块系统。通过按原样包含它,可以创建多个定义,每个.cpp文件一个定义
\ifndef\u包括\u FOO\u H\u
#endif
在这种情况下,通常使用一些#定义如下:
//header.h
#ifdef DEFINE_VARS
#define DEFINE_OR_DECLARE
#else
#define DEFINE_OR_DECLARE extern
#endif
DEFINE_OR_DECLARE int globalVariable;
//main.cpp
#define DEFINE_VARS
#include "header.h"
...
//header.cpp
#include "header.h"
...
将全局变量放在某个.c或.cpp文件中,这样它只能定义一次,并使用extern在头文件中引用 比如说, 标题.h
extern int globalVariable;
标题.cpp
int globalVariable = 0;
#include "header.h"
#include"header.h"
int main() {
return 0;
}
source.cpp
int globalVariable = 0;
#include "header.h"
#include"header.h"
int main() {
return 0;
}
main.cpp
int globalVariable = 0;
#include "header.h"
#include"header.h"
int main() {
return 0;
}
可能重复的我永远不会推荐这个。你能解释一下为什么吗?假设我想要
globalVariable
的默认值为4。所以我定义或声明int-globalVariable=4代码>。这将导致出现如下警告:a.c:1:warning:“x”已初始化并声明为“extern”
。但您永远不会在这种情况下指定分配。这种技术在确保头文件不会错过新引入的var[s]方面非常有效。然后在定义源中使用初始化例程,以避免您描述的默认值场景。