头文件中的全局变量导致c++重定义错误



我有一个头文件,其中包含我所有的全局变量(和一个cpp文件来声明它们)我使用#ifndef #define #endif标签,但我仍然得到重新定义错误

我总共有3个头文件和4个cpp文件,所有的头/main.cpp都包含globalvar.h头文件。

代码如下:

GlobalVar.h

#ifndef GLOBALVAR_H
#define GLOBALVAR_H
#include "SDL.h"
extern const int SCREEN_WIDTH = 960;
extern const int SCREEN_HEIGHT = 960;
extern const int SCREEN_BPP = 32;
extern const int FRAMES_PER_SECOND = 30;
//tiles attribute
extern const int TILE_WIDTH = 64;
extern const int TILE_HEIGHT = 64;
extern const int TOTAL_TILES = 150;
extern const int TOTAL_SPRITES = 64;
//tile sprites
extern SDL_Rect clip[144];
//Images / backgrounds
extern SDL_Surface* screen;
extern SDL_Surface* background;
extern SDL_Surface* Ike;
extern SDL_Surface* thetiles;
extern SDL_Event event;
#endif

GlobalVar.cpp

#include "GlobalVar.h"
const int SCREEN_WIDTH = 960;
const int SCREEN_HEIGHT = 960;
const int SCREEN_BPP = 32;
const int FRAMES_PER_SECOND = 30;
//tiles attribute
const int TILE_WIDTH = 64;
const int TILE_HEIGHT = 64;
const int TOTAL_TILES = 150;
const int TOTAL_SPRITES = 64;
//tile sprites
SDL_Rect clip[144];
//Images / backgrounds
SDL_Surface* screen;
SDL_Surface* background;
SDL_Surface* Ike;
SDL_Surface* thetiles;
SDL_Event event;

对于如何处理引起麻烦的常量,您有两种选择。

选项1

从标题中删除extern:

#ifndef GLOBALVAR_H
#define GLOBALVAR_H
#include "SDL.h"
const int SCREEN_WIDTH = 960;
const int SCREEN_HEIGHT = 960;
const int SCREEN_BPP = 32;
const int FRAMES_PER_SECOND = 30;
const int TILE_WIDTH = 64;
const int TILE_HEIGHT = 64;
const int TOTAL_TILES = 150;
const int TOTAL_SPRITES = 64;
extern SDL_Rect clip[144];
extern SDL_Surface* screen;
extern SDL_Surface* background;
extern SDL_Surface* Ike;
extern SDL_Surface* thetiles;
extern SDL_Event event;
#endif

如果你这样做,你不能在GlobalVar.cpp中定义变量。

选项2

从头文件中删除初始化式:

#ifndef GLOBALVAR_H
#define GLOBALVAR_H
#include "SDL.h"
extern const int SCREEN_WIDTH; // = 960;
extern const int SCREEN_HEIGHT; // = 960;
extern const int SCREEN_BPP; // = 32;
extern const int FRAMES_PER_SECOND; // = 30;
extern const int TILE_WIDTH; // = 64;
extern const int TILE_HEIGHT; // = 64;
extern const int TOTAL_TILES; // = 150;
extern const int TOTAL_SPRITES; // = 64;
extern SDL_Rect clip[144];
extern SDL_Surface* screen;
extern SDL_Surface* background;
extern SDL_Surface* Ike;
extern SDL_Surface* thetiles;
extern SDL_Event event;
#endif

现在您需要定义和初始化GlobalVar.cpp中的常量。

这样做的缺点是不能在需要编译时整数常量的上下文中使用SCREEN_WIDTH这样的名称,例如数组的维数或switch语句的case子句。

选项1是更常用的方法

您应该只在一个地方给出常量值。

您可以将extern声明保留在头文件中(不带值)并将值保存在cpp文件中,删除extern关键字并仅在头文件中定义值。

相关内容

  • 没有找到相关文章

最新更新