Objective-C ошибка: элемент инициализации не является константой

Почему компилятор дает мне следующее сообщение об ошибке в предоставленном коде: "элемент инициализации не является постоянным". Соответствующий код C/С++ отлично компилируется под gcc.

#import <Foundation/Foundation.h>

const float a = 1;
const float b = a + a; // <- error here

int main (int argc, const char * argv[]) {
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

    // insert code here...
    NSLog(@"Hello, World!");
    [pool drain];
    return 0;
}

Ответ 1

Этот код будет компилироваться правильно, если инструкции const float появляются где-то, кроме области файла.

Это, по-видимому, часть стандарта. Важно, чтобы все объявленные переменные области файла инициализировались с помощью константных выражений, а не выражений с постоянными переменными.

Вы инициализируете float 'b' со значением другого объекта. Значение любого объекта, даже если оно является константой, не является постоянным выражением в C.

Ответ 2

@dreamlax верен, вы не можете иметь объявление const, инициализация которого зависит от другой переменной (const). Если вам нужен один, чтобы зависеть от другого, я предлагаю создать переменную, которую можно рассматривать как константу, и инициализировать ее только один раз. Подробнее см. Эти вопросы:

Ответ 3

У меня нет Xcode на моей машине, поэтому я не могу попробовать свой пример,

Но вы можете попробовать

#define A (1) 
#define B (A + A)

const float a = A;
const float b = B;