C结构初始化与变量

我遇到了C89之后似乎没有通过任何C标准解决的问题,除非提到结构初始化限制已被解除。 但是,我使用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 */ /* ... */ } 

任何想法为什么,或什么标准不允许?

以下引用来自C99理由 :

C89委员会考虑了允许自动聚合初始化器由括号括起来的一系列任意执行时表达式组成的提议,而不仅仅是那些可用于转换时静态初始化器的表达式。 C89委员会选择仅允许静态初始化程序,而不是确定一套可以避免病态情况但又不是过于武断的规则。 这被重新考虑,执行时表达式在C99中有效。

问题是C不是对象语言,只能进行严格的输入。 此外,C维持结构和数组之间的差异。

代码必须工作的方式是

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

对于C89来说这是正常的…初始化器确实需要保持不变,即。 能够在编译时确定。 这意味着初始化器中没有变量,对于其他类型也是如此,而不仅仅是结构。 在C99中,您的代码可以正常工作。