题
在以下代码:
#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来检查!
解决方案
在 GNU C语言扩展浇铸到一个联合被标记为一个扩展C标准。所以,很可能你不会在C99或任何其他C标准中找到它。 IBM的C编译器支持该扩展,以及
其他提示
[neilb@GONERIL NeilB]$ gcc -Wall -pedantic sw.c
sw.c: In function 'main':
sw.c:11: warning: ISO C forbids casts to union type
sw.c:12: warning: ISO C forbids casts to union type
不隶属于 StackOverflow