多个定义(LNK2005)错误

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

我错过了什么吗?

Alo*_*ave 5

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

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