我正在使用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中它完全正常。
感谢您的帮助。如果需要其他信息,请与我们联系。
编辑:请注意,除了我在头文件中尝试使用数组时,我没有错误。虽然我做了什么来理解传统的做事方式,但我也想了解为什么从基本的角度来看,我不能在这样的头文件中声明和初始化数组。
答案 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;
那是因为它不是声明,它没有引入新名称:它是一项任务。
哦,我的眼睛受到大写的伤害!
干杯,