我有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
答案 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了解更多信息。