首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >error LNK2005,是否已定义?

error LNK2005,是否已定义?
EN

Stack Overflow用户
提问于 2012-04-07 00:47:33
回答 8查看 205K关注 0票数 74

我在一个Win32控制台应用程序中有两个文件,A.cpp和B.cpp。

这两个文件都只包含以下两行代码:

代码语言:javascript
复制
#include "stdafx.h"
int k;

编译它时会产生以下错误

代码语言:javascript
复制
Error   1   error LNK2005: "int k" (?a@@3HA) already defined in A.obj

我不明白这是怎么回事。

有人能给我解释一下吗?

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2012-04-07 00:50:04

为什么出现此错误?

您破坏了,因此出现了链接错误。

建议的解决方案:

如果在两个cpp文件中需要相同的命名变量,则需要使用无名命名空间(匿名命名空间)来避免错误。

代码语言:javascript
复制
namespace 
{
    int k;
}

如果你需要在多个文件中共享同一个变量,那么你需要使用extern

A.h

代码语言:javascript
复制
extern int k;

A.cpp

代码语言:javascript
复制
#include "A.h"
int k = 0;

B.cpp

代码语言:javascript
复制
#include "A.h"

//Use `k` anywhere in the file 
票数 101
EN

Stack Overflow用户

发布于 2013-11-02 18:19:49

在项目的设置中,将/FORCE:MULTIPLE添加到链接器的命令行选项中。

来自MSDN:“无论LINK是否为符号找到多个定义,都使用/FORCE:MULTIPLE创建输出文件。”

票数 82
EN

Stack Overflow用户

发布于 2012-04-07 00:52:41

如果希望这两个变量引用相同的变量,则其中一个应具有int k;,另一个应具有extern int k;

对于这种情况,通常将定义(int k;)放在一个.cpp文件中,并将声明(extern int k;)放在头文件中,以便在需要访问该变量的任何地方包含。

如果您希望每个k都是一个恰好具有相同名称的单独变量,您可以将它们标记为static,如:static int k; (在所有文件中,或者至少在一个文件之外的所有文件中)。或者,您可以使用匿名名称空间:

代码语言:javascript
复制
namespace { 
   int k;
};

同样,在除了最多一个文件之外的所有文件中。

在C中,编译器通常对此不是很挑剔。具体地说,C有一个“暂定定义”的概念,所以如果您有两次类似int k;的东西(在相同或不同的源文件中),每个都将被视为暂定定义,并且它们之间不会有冲突。然而,这可能有点混乱,因为您仍然不能有两个都包含初始化器的定义--带有初始化器的定义总是一个完整的定义,而不是一个临时的定义。换句话说,int k = 1;出现两次是错误的,但是int k;出现在一个地方,而int k = 1;出现在另一个地方就不会了。在这种情况下,int k;将被视为一个暂定定义,而int k = 1;将被视为一个定义(并且两者引用相同的变量)。

票数 15
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10046485

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档