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

Я хочу создать постоянный статический массив, который будет использоваться во всем файле реализации 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 цели:

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

Любые предложения?

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

Ответ 2

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

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

Ответ 3

#define NUM_TYPES 4

Ответ 4

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

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

Ответ 5

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

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

Ответ 6

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

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