Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jquery-ui/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ extern变量导致多个定义错误_C++_Extern_Multiple Definition Error - Fatal编程技术网

C++ extern变量导致多个定义错误

C++ 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; :

我一直在尝试使用extern,以便使用先前定义的变量

我以前没有使用过extern,现在我需要使用它,以便只定义一次变量并跨多个文件使用它们

我已经为这个问题编写了最小化版本的代码。我有四个文件

lib.h

main.cpp

#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”变量并在同一个文件中初始化它(因为它以后会在同一个文件中使用)
当存在define-guard时,为什么要多次包含
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;