Ответ 1
Причиной этого предупреждения является то, что const в c не означает константу. Это означает "только чтение" . Таким образом, значение хранится по адресу памяти и может быть изменено машинным кодом.
Я хочу создать постоянный статический массив, который будет использоваться во всем файле реализации 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
Причиной этого предупреждения является то, что const в c не означает константу. Это означает "только чтение" . Таким образом, значение хранится по адресу памяти и может быть изменено машинным кодом.
Если вы все равно будете использовать препроцессор, в соответствии с другими ответами, вы можете сделать компилятор автоматически определяющим значение 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
};