如何避免头文件中定义的变量的LNK2005链接器错误?

Mar*_*lor 6 c++ header include linker-errors

我有3个cpp文件,看起来像这样

#include "Variables.h"
void AppMain() {
    //Stuff...
}
Run Code Online (Sandbox Code Playgroud)

他们都在里面使用相同的变量,所以他们有相同的标题,但我得到这样的东西

1>OnTimer.obj : error LNK2005: "int slider" (?slider@@3HA) already defined in AppMain.obj
Run Code Online (Sandbox Code Playgroud)

这是为什么?

Jam*_*are 16

请记住,#include类似于剪切和粘贴包含它的源文件中包含的文件(这是一个粗略的类比,但你明白了).这意味着如果你有:

int x;  // or "slider" or whatever vars are conflicting
Run Code Online (Sandbox Code Playgroud)

在头文件中,头文件包含在一个程序中的三个源文件中,然后它们都将具有一个将被冲突的全局命名x.

你想要做的是将变量定义为extern,以便.cpp文件都将获得声明,然后在一个.cpp文件中给出实际的定义.

在Variables.h中:

extern int x;
Run Code Online (Sandbox Code Playgroud)

在SomeSourceFile.cpp中

int x;
Run Code Online (Sandbox Code Playgroud)

当然,我建议不要使用全局变量,但如果你必须使用它们,这将使它们不会发生冲突.