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

C++ 头文件中的全局变量导致重新定义错误c++;,c++,global-variables,C++,Global Variables,我有一个包含所有全局变量的头文件(和一个声明它们的cpp文件) 我使用了#ifndef#define#endif标记,但仍然会出现重新定义错误 我总共有3个头文件和4个cpp文件,所有的header/main.cpp都包含globalvar.h头文件 代码如下: 环球航空公司 GlobalVar.cpp 您应该只在一个位置提供常量值 您可以将extern声明保留在标题中(不带值),并将值保存在cpp文件中,或者删除extern关键字并仅在标题中定义值。对于如何处理导致问题的常量,您有两个选项 选

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

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

代码如下:

环球航空公司 GlobalVar.cpp
您应该只在一个位置提供常量值


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

对于如何处理导致问题的常量,您有两个选项

选择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
#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
中定义变量

选择2 从标题中删除初始值设定项:

#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
#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
中定义和初始化常量

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


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

您是否像在
GlobalVar.cpp
中那样在所有源文件中提供全局变量的定义?您应该删除外部文件中的赋值,以及剪辑[144]s.b.clip[]。您还可以将它们放在命名空间或静态类中,以避免与其他全局变量(例如SDL)发生冲突。除此之外,您还需要提供编译器错误,并在其他文件中显示其用法。这非常简单。不要使用全局变量。