Инициализация структуры 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 ваш код будет работать.

Другие вопросы по тегам