用变量进行C结构初始化

时间:2011-10-09 01:34:04

标签: c variables initialization structure

我遇到了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 */

 /* ... */

}

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

3 个答案:

答案 0 :(得分:6)

以下引用来自C99 rationale

  

C89委员会审议了允许自动化的提案   聚合初始化器由一个括号括起来的系列组成   任意执行时表达式,而不仅仅是那些可用的表达式   翻译时静态初始化程序。而不是确定一组   这些规则可以避免病态病例,但似乎也没有   任意,C89委员会选择只允许静态   初始化。这被重新考虑,执行时表达式   在C99中有效。

答案 1 :(得分:2)

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

代码的工作方式是

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

答案 2 :(得分:0)

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