【发布时间】:2011-01-09 22:55:10
【问题描述】:
以下代码:
#include <stdio.h>
typedef union {
int n;
char *s;
} val_t;
int main(void) {
val_t v1,v2;
v1 = (val_t)"Hello World";
v2 = (val_t)10;
printf("%s %d\n", v1.s, v2.n);
return(1);
}
使用 gcc 正确编译和执行。如果尝试强制转换联合中没有合适字段的常量,则会产生错误消息。
但是,查看 (C99) 标准,我无法找到描述此行为的部分。因此,我的问题:
C 标准是否保证我可以将常量转换为联合类型,前提是联合类型具有兼容类型的字段?
或者,换句话说:
((val_t)10)是val_t类型的有效右值吗?
了解其他编译器(或至少 MS Visual C++)是否支持此行为也会很有趣。有人知道吗?
编辑: 强制转换为联合是 GCC 扩展,因此使用它不是一个好主意。
感谢 Maurits 和 Neil!没想过用-pedantic来检查!
【问题讨论】:
-
除了这看起来很糟糕的编程习惯之外,这是一个有趣的问题。我认为经过 20 年的 C 编程我已经看到了这一切,显然不是:)
-
@MauritsRijk 这实际上是在 C 中实现泛型容器的好方法。您将容器的键设为联合类型,其中包含 int、double 和 void 指针等字段,以及您传入的比较函数知道它需要什么类型并访问相应的联合成员。我实际上不明白为什么它不是语言的标准部分,因为联合在 K&R 中定义的方式,每个成员都与最低地址对齐,联合保证对其所有成员都有正确的内存对齐,并且是足够宽以容纳最宽的一个。