我在一个Win32控制台应用程序中有两个文件,A.cpp和B.cpp。
这两个文件都只包含以下两行代码:
#include "stdafx.h"
int k;编译它时会产生以下错误
Error 1 error LNK2005: "int k" (?a@@3HA) already defined in A.obj我不明白这是怎么回事。
有人能给我解释一下吗?
发布于 2012-04-07 00:50:04
为什么出现此错误?
您破坏了,因此出现了链接错误。
建议的解决方案:
如果在两个cpp文件中需要相同的命名变量,则需要使用无名命名空间(匿名命名空间)来避免错误。
namespace
{
int k;
}如果你需要在多个文件中共享同一个变量,那么你需要使用extern。
A.h
extern int k;A.cpp
#include "A.h"
int k = 0;B.cpp
#include "A.h"
//Use `k` anywhere in the file 发布于 2013-11-02 18:19:49
在项目的设置中,将/FORCE:MULTIPLE添加到链接器的命令行选项中。
来自MSDN:“无论LINK是否为符号找到多个定义,都使用/FORCE:MULTIPLE创建输出文件。”
发布于 2012-04-07 00:52:41
如果希望这两个变量引用相同的变量,则其中一个应具有int k;,另一个应具有extern int k;
对于这种情况,通常将定义(int k;)放在一个.cpp文件中,并将声明(extern int k;)放在头文件中,以便在需要访问该变量的任何地方包含。
如果您希望每个k都是一个恰好具有相同名称的单独变量,您可以将它们标记为static,如:static int k; (在所有文件中,或者至少在一个文件之外的所有文件中)。或者,您可以使用匿名名称空间:
namespace {
int k;
};同样,在除了最多一个文件之外的所有文件中。
在C中,编译器通常对此不是很挑剔。具体地说,C有一个“暂定定义”的概念,所以如果您有两次类似int k;的东西(在相同或不同的源文件中),每个都将被视为暂定定义,并且它们之间不会有冲突。然而,这可能有点混乱,因为您仍然不能有两个都包含初始化器的定义--带有初始化器的定义总是一个完整的定义,而不是一个临时的定义。换句话说,int k = 1;出现两次是错误的,但是int k;出现在一个地方,而int k = 1;出现在另一个地方就不会了。在这种情况下,int k;将被视为一个暂定定义,而int k = 1;将被视为一个定义(并且两者引用相同的变量)。
https://stackoverflow.com/questions/10046485
复制相似问题