我遇到了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 */
/* ... */
}
任何想法为什么,或者什么标准不允许?
答案 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中,您的代码可以正常工作。