struct initializer,使用visual studio的typedef

时间:2009-06-30 17:25:07

标签: c visual-studio

我想知道为什么以下内容不适用于Visual Studio

typedef struct {
    float x, y;
} complexf;

typedef union {
    complexf f;
    long long d;
} rope;

int main(void)
{
    complexf a;
    rope z = {a};
}

错误是在线绳z = {a},无法从complexf转换为float。如果union的第一个成员不是typedef,那么它可以工作。这是编译器错误,还是C的黑暗边缘?

3 个答案:

答案 0 :(得分:7)

ANSI C标准(又名C89),3.5.7:

  

初始化程序中的所有表达式   对于具有静态存储的对象   duration 或初始化列表中的   具有聚合或联合的对象   type 应为常量表达式

此限制的后半部分已在C99中删除,但VS未正确支持。

答案 1 :(得分:1)

当我使用/ W4编译时,在VS 6.0中

我得到了

警告C4204:使用非标准扩展名:非常量聚合初始化程序

所以这让我觉得它不是标准的C而且你在编译器依赖的土地上。

答案 2 :(得分:0)

G++ 3.4.4 Cygwin上的':'工作正常。

除了';'最后需要更改为'__int64' 并且,我将'long long'更改为 rope z = *(rope *)&a;


由于我对C代码有更强烈的偏见,我会写,

:-)

将其强制转换为C ++编译器rope z; z.f = a; 但是,不要这样做......

正如大卫在评论中指出的那样,正确的方法是

{{1}}