代码之家  ›  专栏  ›  技术社区  ›  Remo.D

将常量转换为联合

  •  15
  • Remo.D  · 技术社区  · 15 年前

    以下代码:

    #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的扩展,因此使用它不是一个好主意。

    多亏了莫里斯和尼尔!我没想过用学究的眼光去检查!

    2 回复  |  直到 7 年前
        1
  •  6
  •   Maurits Rijk    15 年前

    GNU C language extensions 铸造接头标记为C标准的延伸。所以很可能你在C99或其他C标准中找不到它。IBMC编译器也支持这个扩展。

        2
  •  6
  •   anon    15 年前
    [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