2011-10-09 113 views
3

我遇到了一个问题,似乎在C89之后的任何C标准都没有解决,除非提及结构初始化限制已被解除。但是,我使用Open Watcom IDE(用于调试)遇到错误,其中编译器指出初始化程序必须是常量表达式。用变量C结构初始化

以下是发生了什么事情的要点。

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

我不知道你的问题的答案,但我会建议你创建一个函数,如:POINT createPOINT(x,y)来初始化所有POINT类型的变量。 –

回答

6

以下报价是从C99 rationale

的C89委员会审议了关于允许自动 总初始化到由一撑包含任意执行时间表达式的 系列,而不仅仅是可用于翻译时静态初始化程序的 。 C89委员会决定只允许静态的 初始值设定项,而不是确定一套可避免病态情况的规则,但看起来并不过分。重新考虑了这一点,并且在C99中有效的执行时表达式为 。

+0

啊!这是另一个C99功能。这就解释了为什么只有Watcom的编译器有问题。谢谢。 –

2

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

你的代码将不得不工作的方式是

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

我知道这是一个解决方案,我更想知道为什么Watcom的编译器会在其他人(gcc和MSVC具体)抛出错误的时候抛出错误......您是否认为Watcom仍然使用C89以前的标准? –

+0

这完全有可能。并非所有编译器都完全符合规范。 –

+0

默认情况下,GCC不会针对C89进行严格编译,除非指定'-ansi'或'std = c89'。默认情况下,它是具有某些C99功能的C89。可以说,你应该总是按照GCC的标准进行编译以获得可移植性。 –

0

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