多个定义(LNK2005)错误

时间:2011-12-29 15:42:16

标签: c++ compiler-errors

我最近尝试创建一个全局头文件,其中包含错误代码的所有定义(即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曾经应该阻止这种情况(我也试过#ifndef,但这也行不通。)

编译器输出:

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

我错过了什么吗?

3 个答案:

答案 0 :(得分:5)

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

解决方案是:
在你的一个头文件中声明它们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;

<强> main.cpp中:

#include "globals.h"

<强> cTile.h:

#include "globals.h"

答案 1 :(得分:3)

你可以简单地使用枚举:

globals.h:

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

答案 2 :(得分:0)

使用#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 */