Zil*_*ion 0 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;
Run Code Online (Sandbox Code Playgroud)
main.cpp中:
#include "globals.h"
#include "cTile.h"
/* rest of the code */
Run Code Online (Sandbox Code Playgroud)
cTile.h:
#pragma once
#include "globals.h"
class cTile {
};
Run Code Online (Sandbox Code Playgroud)
它抱怨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
我错过了什么吗?
不要在头文件中声明变量.
在头文件中声明变量时,会在包含头文件的每个转换单元中创建变量的副本.
解决方案是:在你的一个头文件中
声明它们extern,并在你的一个cpp文件中定义它们.
globals.h:
extern int SCREEN_LOAD_ERROR;
extern int NO_ERROR;
Run Code Online (Sandbox Code Playgroud)
globals.cpp:
#include "globals.h"
int SCREEN_LOAD_ERROR = 0;
int NO_ERROR = 0;
Run Code Online (Sandbox Code Playgroud)
main.cpp中:
#include "globals.h"
Run Code Online (Sandbox Code Playgroud)
cTile.h:
#include "globals.h"
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
565 次 |
| 最近记录: |