我最近尝试创建一个全局头文件,其中包含错误代码的所有定义(即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中定义
我错过了什么吗?
答案 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 */