Изменяемый массив в области видимости файла - PullRequest
81 голосов
/ 11 ноября 2009

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

Есть предложения?

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

Ответы [ 6 ]

60 голосов
/ 19 февраля 2011

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

32 голосов
/ 11 ноября 2009

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

#define NUM_TYPES (sizeof types / sizeof types[0])
static int types[] = { 
  1,
  2, 
  3, 
  4 };
21 голосов
/ 11 ноября 2009
#define NUM_TYPES 4
11 голосов
/ 11 ноября 2009

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

typedef enum {
    typeNo1 = 1,
    typeNo2,
    typeNo3,
    typeNo4,
    NumOfTypes = typeNo4
}  TypeOfSomething;
3 голосов
/ 04 декабря 2016

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

enum { NUM_TYPES = 4 };
static int types[NUM_TYPES] = { 
  1, 2, 3, 4
};
3 голосов
/ 16 августа 2014

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

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

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