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

时间:2011-10-09 15:18:23

标签: c++ global-variables

我有一个头文件,它包含我所有的全局变量(以及一个cpp文件来声明它们) 我使用#ifndef #define #endif代码,但仍然会出现重新定义错误

我总共有3个头文件和4个cpp文件,所有header / 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;

2 个答案:

答案 0 :(得分:9)

如何处理导致问题的常数,你有两个选择。

选项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等名称,例如数组的维度或case语句的switch子句

因此,选项1是更经常使用的技术。

答案 1 :(得分:3)

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

您要么在标题中保留extern声明(没有值)并在cpp文件中包含值,删除extern关键字并定义仅在标题中的值。