我有一个头文件,它包含我所有的全局变量(以及一个cpp文件来声明它们)
我使用#ifndef
#define
#endif
代码,但仍然会出现重新定义错误
我总共有3个头文件和4个cpp文件,所有header / main.cpp都包含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
#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;
答案 0 :(得分:9)
如何处理导致问题的常数,你有两个选择。
从标题中删除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
中定义变量。
从标题中删除初始值设定项:
#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等名称,例如数组的维度或case
语句的switch
子句
因此,选项1是更经常使用的技术。
答案 1 :(得分:3)
您应该只在一个地方给出常量值。
您要么在标题中保留extern
声明(没有值)并在cpp文件中包含值,或删除extern
关键字并定义仅在标题中的值。