【问题标题】:Multiple Definition (LNK2005) errors多重定义 (LNK2005) 错误
【发布时间】:2011-12-29 15:42:15
【问题描述】:

我最近尝试创建一个全局头文件,其中包含错误代码的所有定义(即 NO_ERROR、SDL_SCREEN_FLIP_ERROR 等),这些只是我将在此处定义的整数。

我在我的两个 .cpp 文件中都包含了这些内容,但是我收到一个错误,指出我定义了两次。

globals.h:

#pragma once

// error related globals
int SCREEN_LOAD_ERROR = 1;
int NO_ERROR = 0;

main.cpp:

#include "globals.h"
#include "cTile.h"
/* rest of the code */

cTile.h:

#pragma once
#include "globals.h"

class cTile {
};

抱怨 SCREEN_LOAD_ERROR 和 NO_ERROR 被定义了两次,但据我所知 #pragma once 应该可以防止这种情况(我也尝试过 #ifndef,但这也不起作用)。

编译器输出:

1>main.obj : error LNK2005: "int SCREEN_LOAD_ERROR" (?SCREEN_LOAD_ERROR@@3HA) 已经在 cTile.obj 中定义 1>main.obj : error LNK2005: "int NO_ERROR" (?NO_ERROR@@3HA) 已在 cTile.obj 中定义

我错过了什么吗?

【问题讨论】:

    标签: c++ compiler-errors


    【解决方案1】:

    不要在头文件中声明变量。
    当您在头文件中声明变量时,会在包含头文件的每个翻译单元中创建变量的副本。

    解决办法是:
    在你的一个头文件中声明它们extern,并在你的一个 cpp 文件中定义它们。

    globals.h:

    extern int SCREEN_LOAD_ERROR;
    extern int NO_ERROR;
    

    globals.cpp:

    #include "globals.h"
    int SCREEN_LOAD_ERROR = 0;
    int NO_ERROR = 0;
    

    ma​​in.cpp:

    #include "globals.h"
    

    cTile.h:

    #include "globals.h"
    

    【讨论】:

    • 干杯,这就是问题所在。不知道我不被允许这样做。
    【解决方案2】:

    你可以简单地使用一个枚举:

    globals.h:

    enum
    {
        SCREEN_LOAD_ERROR = 1,
        NO_ERROR = 0,
        // ...
    }
    

    【讨论】:

    • 是的,这似乎是正确的做法。
    【解决方案3】:

    使用#ifndef 可以正常工作。(虽然可以,但这不是最佳做法)。试试这样:

    globals.h

    #ifndef GLOBALS
    #define GLOBALS
    
    int SCREEN_LOAD_ERROR = 1;
    int NO_ERROR = 0;
    
    #endif
    

    cTile.h:

    #include "globals.h"
    
    class cTile {
    };
    

    main.cpp:

    #include "globals.h"
    #include "cTile.h"
    /* rest of the code */
    

    【讨论】:

    • 这是错误的。包含守卫对于每个翻译单元都是持久的。如果不同的 cpp 包含标头,它将重新定义变量。声明应保留在标头中,定义应移至单个实现文件中。
    猜你喜欢
    • 2012-04-25
    • 1970-01-01
    • 2010-10-11
    • 2015-08-10
    • 1970-01-01
    • 2014-12-21
    • 2022-01-13
    • 1970-01-01
    相关资源
    最近更新 更多