我有一个头文件,其中包含我所有的全局变量(和一个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
关键字并仅在头文件中定义值。