首页  >  文章  >  后端开发  >  为什么我的 C 项目中出现“错误 LNK2005:已定义”?

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

Susan Sarandon
Susan Sarandon原创
2024-11-02 11:16:02552浏览

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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn