Инициализация структуры 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 */

 /* ... */

}

Любые идеи, почему, или какой стандарт запрещает это?

Ответ 1

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

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

Ответ 2

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

Как ваш код будет работать,

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

Ответ 3

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