Подтвердить что ты не робот

Элемент инициализатора не является постоянным в 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: ошибка: элемент инициализации не является константой

У кого-то есть объяснение?

4b9b3361

Ответ 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) не является константным выражением (т.е. Выражение не может быть оценено во время фазы перевода).