Следующий код не компилируется:
const int a = 0;
struct Test
{
int b;
};
static const struct Test test =
{
a
};
Это сокращенный пример того, что я действительно пытаюсь сделать, но что я делаю не так?
Следующий код не компилируется:
const int a = 0;
struct Test
{
int b;
};
static const struct Test test =
{
a
};
Это сокращенный пример того, что я действительно пытаюсь сделать, но что я делаю не так?
В версии C89 / 90 языка C все агрегатные инициализаторы должны состоять только из констант. В терминологии языка C константа типа int
является буквальным значением, например 10
, 20u
, 0x1
и т. Д. Члены перечисления также являются константами. Переменные типа const int
не являются константами в C. Вы не можете использовать переменную const int
в агрегатном инициализаторе. (По этой причине в языке C, когда вам нужно объявить именованную константу, вы должны использовать либо #define
, либо enum
, но не квалификатор const
.)
В C99 это требование для агрегатных инициализаторов было ослаблено. Теперь можно использовать неконстанты в агрегатных инициализаторах локальных объектов. Однако для статических объектов (как в вашем примере) требование все еще сохраняется. Итак, даже в C99 вам придется либо использовать
#define a 0
или используйте именованную константу перечисления, как предложено в ответе @R ...
a
не является постоянным выражением. Это переменная с квалификацией const
. Если вам нужно символьное имя, которое можно использовать в постоянных выражениях, вам понадобится макрос препроцессора (#define a 0
) или перечисление (enum { a = 0 };
).
const
квалифицированные целочисленные переменные, инициализированные константными выражениями в других константных выражениях. 26.05.2011