C++ extern变量导致多个定义错误
我一直在尝试使用extern,以便使用先前定义的变量 我以前没有使用过extern,现在我需要使用它,以便只定义一次变量并跨多个文件使用它们 我已经为这个问题编写了最小化版本的代码。我有四个文件 lib.h main.cppC++ extern变量导致多个定义错误,c++,extern,multiple-definition-error,C++,Extern,Multiple Definition Error,我一直在尝试使用extern,以便使用先前定义的变量 我以前没有使用过extern,现在我需要使用它,以便只定义一次变量并跨多个文件使用它们 我已经为这个问题编写了最小化版本的代码。我有四个文件 lib.h main.cpp #include "vehicle.h" #include "lib.h" int main(int argc, char** argv) { ::lib::isInit("main"); ::lib::initialized = true; :
#include "vehicle.h"
#include "lib.h"
int main(int argc, char** argv) {
::lib::isInit("main");
::lib::initialized = true;
::lib::isInit("main");
Vehicle vehicle("Toyota", "Corolla", 2013);
return 0;
}
我用的是g++
g++ -Wno-write-strings main.cpp vehicle.cpp -o bin/main.cpp.bin
我发现以下错误:
/tmp/cclVpsgT.o:(.bss+0x0): multiple definition of `lib::initialized'
/tmp/ccmJKImL.o:(.bss+0x0): first defined here
collect2: error: ld returned 1 exit status
我已检查了以下各项的输出:
g++ -Wno-write-strings main.cpp vehicle.cpp -E
每次包含lib.h时都会出现多个定义
我的问题是:
- 当存在define-guard时,为什么要多次包含lib.h
- 我如何定义“extern”变量并在同一个文件中初始化它(因为它以后会在同一个文件中使用)
lib.h
您需要删除定义:
bool initialized = false;
并将其放在一个且仅一个源文件中
“包含保护”可防止同一头文件多次包含在同一个中,而不是在不同的翻译单元中。在头文件中定义变量
initialized
,该变量包含在不同的翻译单元中,然后每个TU都有一个名为initialized
的符号,该符号将打破
如何定义“extern”变量并在同一个文件中初始化它(因为它以后会在同一个文件中使用)
如果希望在同一文件中使用该变量,为什么要将其设置为extern
?如果要在不同的TU之间共享同一变量,则需要使用extern
。如果你只需要在一个TU中在全局范围内使用它,你应该简单地将它放在一个文件中,没有办法在同一个文件中使用它吗?@mkhan3189:第二个问题的答案是否回答了你评论中的问题?是的:)将此标记为答案,因为这确实回答了我的问题。我相信没有办法在同一个文件中初始化,因为它是extern。但是在我将其标记为answer之前,您是否知道如何在同一个文件中定义和声明同一个变量(当然extern至少需要两个文件来使用它,static为每个include创建自己的变量副本)但是还有别的办法吗?(希望问题是清楚的)@mkhan3189:这是不可能的,因为您不能在头文件中定义一个对象并在多个文件中包含此头文件。它违反了ODR。
/tmp/cclVpsgT.o:(.bss+0x0): multiple definition of `lib::initialized'
/tmp/ccmJKImL.o:(.bss+0x0): first defined here
collect2: error: ld returned 1 exit status
g++ -Wno-write-strings main.cpp vehicle.cpp -E
bool initialized = false;