LNK2005: “已经定义”错误

3

我正在尝试从不同的.cpp文件中使用全局变量。我已经有一个init.h文件:

//init.h
#ifndef init
#define init
int a = 3;
#endif

我有一个 init.cpp 文件,内容如下:

//init.cpp #include init.h

最后,我的 main.cpp 文件如下:

//main.cpp
#include "init.h"
int main(void)
{
    while(1)
    {
    }
}

在此之后,我遇到了错误:
1>init.obj : error LNK2005: "int a" (?a@@3HA) already defined in main.obj
1> ..deneme.exe : fatal error LNK1169: one or more multiply defined symbols found

为什么我的#infdef控制器不能解决这个问题?我还尝试使用#pragma once,但是我得到了相同的错误。我的代码有什么问题吗?

1个回答

9
你需要将变量标记为extern,并仅在一个实现文件中进行定义。
现在的代码违反了“单一定义规则”。在这种情况下,包含保护不起作用,因为所有包含该头文件的翻译单位都会重新定义变量。
你实际上需要做的是:
//init.h
#ifndef init
#define init
extern int a;
#endif

并且这个定义是:
//init.cpp
#include "init.h"
int a = 3;

此外,在使用全局变量之前要三思。你实际上想要实现什么?

好的,我忘记写包含init.h文件的init.cpp文件了。当我使用extern时问题仍然存在。 - volkan sezer
1
@volkansezer 那不可能是对的。你确定你没有忘记从头文件中删除 =3 吗?你确定你在头文件中声明了它为 extern 而不是实现文件中? - Luchian Grigore
是的,你说得对,我已经按照你的建议进行了更改,问题已经解决了,非常感谢你。对于我来说,从不同的源文件中实现相同的全局变量非常重要,再次感谢。 - volkan sezer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接