我想知道为什么以下内容不适用于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的黑暗边缘?
答案 0 :(得分:7)
ANSI C标准(又名C89),3.5.7:
初始化程序中的所有表达式 对于具有静态存储的对象 duration 或初始化列表中的 具有聚合或联合的对象 type 应为常量表达式。
此限制的后半部分已在C99中删除,但VS未正确支持。
答案 1 :(得分:1)
我得到了
警告C4204:使用非标准扩展名:非常量聚合初始化程序
所以这让我觉得它不是标准的C而且你在编译器依赖的土地上。
答案 2 :(得分:0)
G++ 3.4.4
Cygwin
上的':'
工作正常。
除了';'
最后需要更改为'__int64'
并且,我将'long long'
更改为 rope z = *(rope *)&a;
。
由于我对C代码有更强烈的偏见,我会写,
:-)
将其强制转换为C ++编译器rope z; z.f = a;
但是,不要这样做......
正如大卫在评论中指出的那样,正确的方法是
{{1}}