Проблема инициализации массива в заголовочном файле глобальных переменных C ++ - PullRequest
0 голосов
/ 25 июля 2011

Я пишу простую программу с использованием 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 ]

4 голосов
/ 25 июля 2011

Во-первых, определения переменных не должны быть в заголовочных файлах, только 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 голос
/ 26 июля 2011

Как уже объяснил Бен Фойгт, ваша проблема не имеет ничего общего с заголовочными файлами.Просто вы поместили обычные исполняемые операторы, которые не являются объявлениями, непосредственно в область пространства имен (то есть вне какой-либо функции или класса).Вы не можете.

Это утверждение технически хорошо:

const int CARD_BACK = 0;

Это технически хорошо, потому что это объявление.Там нет назначения.= здесь не обозначает присваивание, но является частью синтаксиса объявления, указывающего, что инициализатор следует.

Я говорю «технически», потому что вы действительно должны зарезервировать ВСЕ UPPERCASE имена для макросов, но компилятор невсе равно.

С другой стороны, это утверждение не подходит для области имен:

CARD_CLIPS[CARD_BACK].h = 196;

Это потому, что это не объявление, оно не вводит новое имя: этозадание.

О, мои глаза болят от всего этого заглавного!

Приветствия,

1 голос
/ 25 июля 2011

В этой статье могут содержаться рекомендации относительно того, что следует включать в заголовочный файл.В названии написано C, но, конечно, это применимо к C ++.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...