向联盟施放常数

时间:2010-01-27 12:55:40

标签: c types casting

以下代码:

#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来检查!

2 个答案:

答案 0 :(得分:6)

GNU C language extensions中,对联合的转换被标记为C标准的扩展名。所以很可能你不会在C99或任何其他C标准中找到它。 IBM C编译器也支持此扩展。

答案 1 :(得分:6)

[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