C инициализация структуры с переменной


Я столкнулся с проблемой, которая, кажется, не была решена ни одним из стандартов C после C89, за исключением упоминания о том, что были сняты ограничения инициализации структур. Однако я столкнулся с ошибкой, используя Open Watcom IDE (для отладки), где компилятор утверждает, что инициализатор должен быть постоянным выражением.

Вот суть того, что происходит.

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   3  

3 ответа:

Следующая цитата взята из обоснования C99:

Комитет С89 рассмотрел предложения о разрешении автоматического агрегатные инициализаторы, состоящие из заключенного в скобки ряда произвольные выражения времени выполнения, а не только те, которые можно использовать для статический инициализатор времени трансляции. Вместо того, чтобы определить набор правила, которые бы избегали патологических случаев и все же не казались слишком произвольно, комитет С89 решил разрешить только статические инициализаторы. Это было пересмотрено, и выражения времени выполнения являются действителен в C99.

Проблема в том, что C не является объектным языком и выполняет только строгую типизацию. Кроме того, C поддерживает различие между структурами и массивами.

Ваш код должен работать следующим образом:

void foo( short x, short y )
{
 POINT here; 
 here.x = x;
 here.y = y;
}

Это нормально для C89... инициализаторы должны быть постоянными, т. е. возможность определения во время компиляции. Это означает, что в инициализаторах нет переменных, и это справедливо и для других типов, а не только для структур. В C99 ваш код будет работать.