我最近尝试创建一个全局头文件,它将包含错误代码的所有定义(即NO_ERROR、SDL_SCREEN_FLIP_ERROR等)。这些只是我在这里定义的整数。
我在我的两个.cpp文件中都包含了这些,但是我得到了一个错误,声明我定义了两次then。
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被定义了两次,但据我所知,#NO_ERROR一次应该会阻止这种情况(我也尝试了#ifndef,但这也不起作用)。
编译器输出:
1>main.obj :错误LNK2005:"int SCREEN_LOAD_ERROR“(?SCREEN_LOAD_ERROR@@3HA)已在cTile.obj 1>main.obj中定义: error LNK2005:"int NO_ERROR”(?NO_ERROR@@3HA)已在cTile.obj中定义
我是不是遗漏了什么?
发布于 2011-12-29 23:46:06
不要在头文件中声明变量。
在头文件中声明变量时,将在包含头文件的每个转换单元中创建该变量的副本。
的解决方案是:
在其中一个头文件中声明它们为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.h:
#include "globals.h"发布于 2011-12-29 23:46:47
您可以简单地使用枚举:
globals.h:
enum
{
SCREEN_LOAD_ERROR = 1,
NO_ERROR = 0,
// ...
}发布于 2011-12-30 00:00:56
使用#ifndef可以很好地工作(虽然它可以工作,但这不是最佳实践)。试着这样做:
globals.h
#ifndef GLOBALS
#define GLOBALS
int SCREEN_LOAD_ERROR = 1;
int NO_ERROR = 0;
#endifcTile.h:
#include "globals.h"
class cTile {
};main.cpp:
#include "globals.h"
#include "cTile.h"
/* rest of the code */https://stackoverflow.com/questions/8669899
复制相似问题