工会初始化

时间:2011-05-28 10:15:54

标签: c++ c unions

我正在尝试全局初始化union,如下例所示:

#include <cstdio>

typedef union {
    char t[4];
    int i;
} a;

enum {
    w = 5000,
    x,
    y,
    z
};

a temp = {w};
int main() {
    printf("%d %d %d %d %d\n", temp.t[0],temp.t[1],temp.t[2],temp.t[3],temp.i);
    return 0;
}

但是,如果你运行代码,你会注意到temp.i或temp.t [...]实际上都没有提供正确的项目我初始化了联合。我想如果我可以手动初始化整数成员,这将被避免,但不幸的是我不能。我也无法改变结构中元素的排序(交换int和char命令正确地初始化所有内容) - 它们实际上是由外部库提供的。 我的问题是:如何设置结构全局的整数成员,而不是char [4]成员(或者,在这种情况下,只是char []的第一个元素)?

编辑:另外,这个问题有严格的c ++解决方案吗?即命名结构初始化不起作用的一个(因为它在语言中不存在)?

4 个答案:

答案 0 :(得分:11)

在C99中你可以这样做:

a temp = { .i=w };

答案 1 :(得分:7)

您可能希望这样做:

a temp = {i: w};

这应该适用于gccg++

答案 2 :(得分:7)

在C99中,您可以使用命名初始化,如下所示:

a x = { .i = 10 };

有一些使用非标准gcc扩展的建议,但如果编码C我会避免它:

a x = { i : 10 };

您可以使用函数初始化:

inline a initialize( int value ) { // probably choose a better name
   a tmp;
   tmp.i = value;
   return a;
}

然后使用:

a x = initialize( 10 );

编译器将优化副本。

如果您正在使用C ++,则可以为联合类型提供构造函数:

/*typedef*/ union u {           // typedef is not required in general in C++
    char bytes[sizeof(int)];
    int i;
    u( int i = 0 ) : i(i) {}
} /*u*/;

u x( 5 );

答案 3 :(得分:6)

您可以像这样初始化整数成员:

a temp = {
  .i = w
};