使用Visual C ++重新定义静态变量

时间:2019-06-14 07:24:29

标签: c++ static

我有2个文件,每个文件包含一个具有相同名称的静态int变量:

test-1.cpp:

#include "test-2.cpp"

static int a;

int main() {

}

test-2.cpp:

static int a;

void fonction() {

}

当我在命令行上使用cl test-1.cpp进行编译时,出现此错误:

test-1.cpp(3): error C2086: 'int a' : redefinition

3 个答案:

答案 0 :(得分:4)

因为将 test2.cpp包含到test-1.cpp中,所以编译器看到的实际代码是:

static int a;

void fonction() {

}

static int a;

int main() {

}

重新定义。

#include预处理程序命令以文本形式包含文件。

您真正想要的是在Visual Studio项目中同时包含文件test-1.cpp和test-2.cpp。

您想要这个:

test-1.cpp

#include "test-2.h"

static int a;

int main() {
  fonction();
}

test-2.cpp

#include "test-2.h"

static int a;

void fonction() {

}

test-2.h

void fonction();

答案 1 :(得分:3)

当然,您在test-1.cpp中是#including test-2.cpp。好像您只有一个文件。如果您删除#include并执行以下命令

cl test-1.cpp test-2.cpp

然后它将起作用。

这整个领域称为单独编译,这是新手难以应付的事情(这也不常被很好地教导)。由于是单独编译,因此您从不不要在另一个cpp文件中包含一个cpp文件。相反,您应该将两个文件都交给编译器,以便可以分别进行编译。

如果一个cpp文件需要知道另一个cpp文件中定义的内容,则创建一个头文件,其中声明第二个cpp文件中的内容,并将其包含在第一个cpp文件中。

答案 2 :(得分:1)

在此行中

#include "test-2.cpp"

您告诉预处理器将test-2.cpp的内容放入test-1.cpp中。因此,您两次定义static int a;。这是不允许的。要解决此问题,请删除#include

请注意,您需要仔细区分声明(可以多次出现)和定义(只能​​出现一次)。看看this thread了解更多信息。