在以下代码:

#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
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top