首页 > 后端开发 > C++ > 正文

为什么我的 C 项目中出现'错误 LNK2005:已定义”?

Susan Sarandon
发布: 2024-11-02 11:16:02
原创
551 人浏览过

Why am I Getting

揭开错误 LNK2005 的神秘面纱:理解多个定义

在项目中处理多个 C 文件时,“错误 LNK2005,已经定义的”消息可能是一个令人困惑的障碍。此错误表示项目中存在同一变量或函数的多个定义。为了深入研究这个问题,让我们看一个具体的例子。

有问题的场景

考虑一个包含两个文件的 Win32 控制台应用程序:A.cpp 和 B.cpp。两个文件都只包含以下内容:

#include "stdafx.h"
int k;
登录后复制

编译时出现错误:

Error 1 error LNK2005: "int k" (?a@@3HA) already defined in A.obj
登录后复制

问题根源:违反单一定义规则

这个错误背后的基本原理是 C 中强制执行的“单一定义规则”(ODR)。这一规则规定任何变量或函数在整个项目中只能有一个明确的定义。在这种情况下,A.cpp 和 B.cpp 都尝试定义相同的变量“k”,从而违反了 ODR。因此,链接器遇到冲突并触发错误消息。

解决问题

要解决此错误,您可以采用两种主要方法:

方法 1:利用无名命名空间

如果您打算在多个翻译单元(即 cpp 文件)之间共享同一变量,请考虑使用无名命名空间。无名命名空间将变量封装在自己的作用域内,使其在该作用域之外无法访问。

namespace {
    int k;
}
登录后复制

方法 2:外部变量

或者,如果您需要在多个文件之间共享一个变量,但希望保持其对外部代码的可访问性,请使用“extern”关键字。此方法涉及在头文件(例如 A.h)中声明变量:

extern int k;
登录后复制

,然后在其中一个实现文件(例如 A.cpp)中定义它:

#include "A.h"
int k = 0;
登录后复制

以上是为什么我的 C 项目中出现'错误 LNK2005:已定义”?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!