Элемент инициализатора не является постоянным в C
Возможный дубликат:
Ошибка "элемент инициализации не является константой" при попытке инициализировать переменную с константой
Я прихожу из javascript/php/python и, вероятно, что-то не хватает, вот код:
const int a = 50;
const int c = 100;
const int d = 100;
int endX = c + a;
int endY = d;
int startX, startY, b;
Я получаю
ex1.4.c: 6: ошибка: элемент инициализации не является константой
ex1.4.c: 7: ошибка: элемент инициализации не является константой
У кого-то есть объяснение?
Ответы
Ответ 1
Если вы объявляете endX как глобальную переменную, ошибка имеет смысл.
Причина в том, что глобальные переменные инициализируются при компиляции времени, и вы пытаетесь инициализировать endX как операцию, которая должна выполняться во время выполнения.
Ответ 2
К сожалению, в C const
переменные не являются константами.
Ниже приведены выдержки из стандарта c99.
6.7.8 Инициализация
- Все выражения в инициализаторе для объекта с статической продолжительностью хранения должны быть константными выражениями или строками литералов.
Константы определяются следующим образом:
6.4.4 Константы
Синтаксис
константы:
integer-constant (e.g. 4, 42L)
floating-constant (e.g. 0.345, .7)
enumeration-constant (stuff in enums)
character-constant (e.g. 'c', '\0')
Стандарт определяет константные выражения следующим образом:
6.6 Константные выражения
(7) Для постоянных выражений в инициализаторах допускается большая широта. Такое постоянное выражение должно быть или оцениваться одним из следующего:
- арифметическое константное выражение,
- константа нулевого указателя,
- постоянная адреса, или
- константа адреса для типа объекта плюс или минус целочисленное постоянное выражение.
(8) Арифметическое константное выражение должно иметь арифметический тип и должно имеют только операнды, которые являются целыми константами, плавающими константами, константы перечисления, символьные константы и размерность выражений. Операторы Cast в выражении постоянной арифметики должны преобразовывать только арифметические типы для арифметических типов, за исключением как части операнда оператор sizeof, результат которого является целочисленной константой.
Таким образом, c
и a
не являются постоянными выражениями и не могут использоваться в качестве инициализаторов в вашем случае.
Ответ 3
const
выражения должны быть константой времени компиляции в C, в отличие от С++, поэтому c+a
не может использоваться как константа. Обычным способом справиться с этой проблемой на C является использование препроцессора:
#define A 50
#define C 100
#define D 100
int endX = C + A;
int endY = D;
int startX, startY, b;
Ответ 4
Да, вы не можете инициализировать что-то переменной. Компилятор выполняет инициализацию и во время компиляции он не знает значения c+a
;
Инициализация типа int x = 1;
прекрасна, компилятор просто помещает 1
по адресу x
в код объекта.
Чтобы инициализировать что-то до c+a
, вы хотите сделать это во время выполнения, в стартовом коде в c
или конструкторе в C++
.
Ответ 5
В языках программирования C объекты со статической продолжительностью хранения должны быть инициализированы с помощью константных выражений (или совокупности, содержащих постоянные выражения). Если endX
имеет статическую длительность хранения, ее инициализатор (c+a)
не является константным выражением (т.е. Выражение не может быть оценено во время фазы перевода).