Инициализация структуры C переменной
Я столкнулся с проблемой, которая, кажется, не решена ни одним из стандартов C после C89, за исключением упоминания о том, что пределы инициализации структур были сняты. Однако я столкнулся с ошибкой при использовании IDE Open Watcom (для отладки), когда компилятор утверждает, что инициализатор должен быть константным выражением.
Вот суть того, что происходит.
typedef struct{
short x;
short y;
} POINT;
void foo( short x, short y )
{
POINT here = { x, y }; /* <-- This is generating the error for the compiler */
/* ... */
}
Любые идеи почему или какой стандарт запрещает это?
3 ответа
Следующая цитата из обоснования C99:
Комитет C89 рассмотрел предложения о разрешении автоматических агрегатных инициализаторов состоять из заключенных в скобки серий произвольных выражений времени выполнения, а не только тех, которые могут использоваться для статического инициализатора времени перевода. Вместо того чтобы определять набор правил, которые позволили бы избежать патологических случаев и при этом не казаться слишком произвольными, Комитет C89 решил разрешить только статические инициализаторы. Это было пересмотрено, и выражения времени выполнения действительны в C99.
Проблема в том, что C не является языком объектов и выполняет только строгую типизацию. Кроме того, C поддерживает разницу между структурами и массивами.
Ваш код должен работать так:
void foo( short x, short y )
{
POINT here;
here.x = x;
here.y = y;
}
Это нормально для C89... инициализаторы должны быть постоянными, т.е. может быть определен во время компиляции. Это означает отсутствие переменных в инициализаторах, и это верно и для других типов, а не только для структур. В C99 ваш код будет работать.