【问题标题】:Casting a constant to a union将常量转换为联合
【发布时间】: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 中定义的方式,每个成员都与最低地址对齐,联合保证对其所有成员都有正确的内存对齐,并且是足够宽以容纳最宽的一个。

标签: c types casting


【解决方案1】:

GNU C language extensions 中,强制转换为联合被标记为对 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-11-14
      • 2022-08-24
      • 2012-02-08
      • 1970-01-01
      • 2017-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多