在全局变量头文件中初始化数组的问题



我正在使用SDL编写一个简单的程序,但是我遇到了一个奇怪的问题。首先是代码:

#ifndef GLOBAL_VARIABLES_H
#define GLOBAL_VARIABLES_H
#include <string>
#include <cassert>
#include "SDL.h"
#include "SDL_image.h"
using std::string;
const int SCREEN_WIDTH = 800;
const int SCREEN_HEIGHT = 600;
const int SCREEN_BPP = 32;
const string MAIN_BACKGROUND_FILENAME = "tempBackground.jpg";

SDL_Rect CARD_CLIPS[2];
const int CARD_BACK = 0;
const int CARD_FRONT = 1;
CARD_CLIPS[CARD_BACK].h = 196;
CARD_CLIPS[CARD_BACK].w = 286/2;
CARD_CLIPS[CARD_BACK].x = 286/2;
CARD_CLIPS[CARD_BACK].y = 0;
CARD_CLIPS[CARD_FRONT].h = 196;
CARD_CLIPS[CARD_FRONT].w = 286/2;
CARD_CLIPS[CARD_FRONT].x = 0;
CARD_CLIPS[CARD_FRONT].y = 0;
#endif

我得到的错误是:

1>c:users--global variables.h(23): error C2466: cannot allocate an array of constant size 0
1>c:users--global variables.h(23): error C2143: syntax error : missing ';' before '.'
1>c:users--global variables.h(23): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>c:users--global variables.h(23): error C2371: 'CARD_CLIPS' : redefinition; different basic types
1>c:users--global variables.h(18) : see declaration of 'CARD_CLIPS'

每次尝试初始化SDL_Rect的元素时,重复相同的错误。

请注意,SDL部分与问题无关。如果我尝试声明一个int数组并以同样的方式初始化它,我将得到完全相同的错误。如果我把这些放到main。cpp中,它会完全正常工作。

谢谢你的帮助。如果需要更多的信息,请告诉我。

编辑:请注意,除了当我尝试在头文件中使用数组外,我没有得到任何错误。虽然我这样做是为了理解传统的做事方式,但我也想从基本的角度理解为什么我不能像这样在头文件中声明和初始化数组。

首先,变量定义不应该出现在头文件中,只能出现在extern声明中。

第二,可以在定义中初始化变量(包括数组),或者将内容赋值为函数内的可执行语句。你不能把可执行语句放在文件范围内。


数组初始化如下:

int a[4] = { 1, 4, 9, 16 };

not like this:

int a[4];
a[0] = 1;  // ILLEGAL outside a function!
a[1] = 4;
a[2] = 9;
a[3] = 16;

本文可能会提供一些指南,说明头文件中应该包含哪些内容。标题里写的是C当然这也适用于c++

正如Ben Voigt已经解释的那样,您的问题与头文件无关。简单地说,您将普通的可执行语句(不是声明)直接放在名称空间作用域中(也就是说,在任何函数或类之外)。你不能。

这个语句在技术上是正确的:

const int CARD_BACK = 0;

这在技术上是没问题的,因为它是一个声明。没有任务。这里的=不表示赋值,而是声明语法的一部分,表示后面有一个初始化式。

我说"技术上"是因为你真的应该为宏保留所有大写的名字,但是编译器并不关心。

另一方面,这个语句在命名空间范围内是不允许的:

CARD_CLIPS[CARD_BACK].h = 196;

这是因为它不是一个声明,它没有引入一个新名称:它是一个赋值。

哦,我的眼睛被大写字母弄痛了!

欢呼,

最新更新