Измененный массив в области файлов

Я хочу создать постоянный статический массив, который будет использоваться в моем файле реализации Objective-C, подобном тому, что находится на верхнем уровне моего файла «.m»:

static const int NUM_TYPES = 4; static int types[NUM_TYPES] = { 1, 2, 3, 4 }; 

Я планирую позже использовать NUM_TYPES в файле, поэтому я хотел бы поместить его в переменную.

Однако, когда я это делаю, я получаю ошибку

«Измененные типы» в области файлов »

Я понимаю, что это может быть связано с тем, что размер массива является переменной (я не получаю это сообщение, когда я помещаю туда целочисленный литерал, например, static int types[4] ).

Я хочу это исправить, но, возможно, я все об этом ошибаюсь … У меня есть 2 цели:

  1. Чтобы иметь массив, ansible по всему файлу
  2. Чтобы инкапсулировать NUM_TYPES в переменную, поэтому у меня нет одного и того же литерала, разбросанного по разным местам в моем файле

Какие-либо предложения?

[EDIT] Найдено в C Faq: http://c-faq.com/ansi/constasconst.html

Причиной этого предупреждения является то, что константа в c не означает постоянную. Это означает «только чтение». Таким образом, значение сохраняется по адресу памяти и может быть изменено машинным кодом.

Если вы все равно собираетесь использовать препроцессор, в соответствии с другими ответами, вы можете сделать компилятор NUM_TYPES определяющим значение NUM_TYPES :

 #define NUM_TYPES (sizeof types / sizeof types[0]) static int types[] = { 1, 2, 3, 4 }; 
 #define NUM_TYPES 4 

Также можно использовать перечисление.

 typedef enum { typeNo1 = 1, typeNo2, typeNo3, typeNo4, NumOfTypes = typeNo4 } TypeOfSomething; 

Imho это недостаток во многих компиляторах. Я знаю, что компиляторы, с которыми я работал, не сохраняют переменную «static const» в адресе, но заменяют использование в коде самой постоянной. Это можно проверить, так как вы получите ту же контрольную сумму для полученного кода, когда используете директиву #define препроцессоров и когда используете статическую константную переменную.

В любом случае вы должны использовать статические константные переменные вместо #defines, когда это возможно, поскольку static const является безопасным по типу.

Как уже объяснялось в других ответах, const в C просто означает, что переменная доступна только для чтения. Это все еще значение времени выполнения. Однако вы можете использовать enum как реальную константу в C:

 enum { NUM_TYPES = 4 }; static int types[NUM_TYPES] = { 1, 2, 3, 4 }; 
  • Обнуление слабых ссылок в ARC
  • Генерация случайных чисел в Objective-C
  • Основная HTTP-аутентификация на iPhone
  • Слабая переменная NSString не равна нулю после установки единственной сильной ссылки на nil
  • В чем разница между ссылкой __weak и __block?
  • Как определить глобальную переменную, доступ к которой можно получить в любом месте приложения?
  • Есть ли причина объявлять ivars, если вы используете свойства исключительно в Objective-C?
  • Почему NSNumber такие странные saveCounts?
  • @ «Какой-то текст» дает автореализацию или сохранение 1 объекта назад?
  • Какова цель ивара, когда существует свойство?
  • Как определить, являются ли методы Apple асинхронными?
  • Давайте будем гением компьютера.