当前位置:  开发笔记 > 编程语言 > 正文

向联盟施放常数

如何解决《向联盟施放常数》经验,为你挑选了2个好方法。

以下代码:

#include 

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)一个有效的rvalue类型val_t

了解其他编译器(或至少MS Visual C++)是否支持此行为也很有趣.有人知道吗?

编辑:转换为联盟是一个GCC扩展,所以使用它不是一个好主意.

感谢Maurits和Neil!我没想过用-pedantic检查!



1> Maurits Rijk..:

在GNU C语言扩展中,转换为union将标记为C标准的扩展.所以很可能你不会在C99或任何其他C标准中找到它.IBM C编译器也支持此扩展.



2> 小智..:
[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

推荐阅读
sx-March23
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有