2015-07-09 3 views
-1

У меня есть переменная в заголовке:массив сопзЬ статического Int

const static int RED = 0; 
const static int BLUE = 1; 
const static int GREEN = 5; 
const static int DOG = 8; 
const static int CAT = 9; 
const static int SNAKE = 7; 

Как я могу создать глобальный массив и инициализировать их значениями этих переменных const?

Я пробовал:

const static int color[3] = {BLUE, GREEN, DOG}; 
const static int animal[3] = {DOG, CAT, SNAKE}; 

Но компилятор говорят об ошибке:

initializer element is not constant

(мне нужно создать структуру, которую я могу перебираем.)

+2

Почему вместо этого не использовать перечисления? –

+0

@JoachimPileborg Можно ли перебрать перечислимое число, которое не является непрерывным? – moffeltje

ответ

1

Что вы можете сделать, это определить их, так что значения постоянны в время компиляции:

#define RED 0 
#define BLUE 1 
#define GREEN 5 

const static int color[3] = {BLUE, GREEN, DOG}; 

Или вы можете просто установить все элементы массива во время выполнения:

const static int color[3]; 
color[0] = BLUE; 
color[1] = GREEN; 
color[2] = DOG; 

for(i = 0; i < 3; i++){ 
    if(color[i] == BLUE) 
    printf("\nColor nr%d is blue", i); 
} 
1

В C, используя const делает не превращать переменную в константу времени компиляции. Он называется const qualified. Итак, вы не можете использовать переменную const для инициализации другой в глобальной области.

Связанные с C11, глава §6.7.9, Initialization

All the expressions in an initializer for an object that has static or thread storage duration shall be constant expressions or string literals.

Таким образом, чтобы получить вашу работу, вы можете либо сделать RED, BLUE как макрокоманды (с использованием #define), или, перечисление, используя эти имена идентификаторов в качестве констант перечисления.

+0

Хорошее объяснение. BTW, когда я тестировал код с gcc (Apple LLVM version 6.1.0 (clang-602.0.53)), компилятор не жаловался. Кажется, он подключен. –

Смежные вопросы