在全局变量头文件C ++中初始化数组时出现问题

时间:2011-07-25 18:34:09

标签: c++ arrays header

我正在使用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中它完全正常。

感谢您的帮助。如果需要其他信息,请与我们联系。

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

3 个答案:

答案 0 :(得分:4)

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

其次,您可以在定义中初始化变量(包括数组),或者将内容分配为函数内的可执行语句。您不能将可执行语句放在文件范围内。


数组初始化如下所示:

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

不喜欢这样:

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

答案 1 :(得分:1)

This article可能会提供有关头文件中应包含的内容的一些指导。 它在标题中表示C,但当然它适用于C ++。

答案 2 :(得分:1)

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

此声明在技术上很好:

const int CARD_BACK = 0;

技术上很好,因为它是一个声明。没有任务。 =这里不表示赋值,但它是声明语法的一部分,表示后面有一个初始值设定项。

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

另一方面,在命名空间范围内,此语句不正确:

CARD_CLIPS[CARD_BACK].h = 196;

那是因为它不是声明,它没有引入新名称:它是一项任务。

哦,我的眼睛受到大写的伤害!

干杯,