【问题标题】:LNK2005: " already defined errorLNK2005:“已定义错误
【发布时间】:2012-04-25 19:49:30
【问题描述】:

我正在尝试使用分离的 .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,但我得到了同样的错误。我的代码有什么问题?

【问题讨论】:

    标签: c++ linker redefinition


    【解决方案1】:

    您需要将您的变量标记为extern 并在实现文件中只定义一次。

    按照现在的代码,您违反了单一定义规则。在这种情况下,包含保护没有帮助,因为包含该标头的所有翻译单元都重新定义了变量。

    你真正需要的:

    //init.h
    #ifndef init
    #define init
    extern int a;
    #endif
    

    以及定义:

    //init.cpp
    #include "init.h"
    int a = 3;
    

    另外,在使用全局变量之前要三思。你真正想要达到的目标是什么?

    【讨论】:

    • 好吧,我忘了写包含 init.h 文件的 init.cpp 文件。当我使用 extern 时问题仍然存在。
    • @volkansezer 这不可能。你确定你没有忘记从标题中删除 =3 吗?您确定在标头中将其声明为 extern 而不是实现文件?
    • 是的,您是对的,我已按照您的建议进行了更改,问题已解决,非常感谢。从不同的源文件中实现相同的全局变量对我来说非常重要,再次感谢。
    猜你喜欢
    • 1970-01-01
    • 2010-10-11
    • 2015-08-10
    • 1970-01-01
    • 2014-12-21
    • 2022-01-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多