联合只能使用其第一个成员K&R的类型初始化

jiy*_*uru 2 c unions

我正在学习K&R C.在第6.8章中,它指出:

联合只能使用其第一个成员的类型值进行初始化; 因此,u上述联合只能用整数值初始化.

...并定义一个联合u如下:

union u_tag {
  int ival;
  float fval;
  char *sval;
} u;
Run Code Online (Sandbox Code Playgroud)

我不知道怎么理解这个.这是什么意思,初始化u必须如下:

u.ival = 323;
Run Code Online (Sandbox Code Playgroud)

很明显,情况并非如此,因为我可以初衷u为:

u.fval = 1.0;
Run Code Online (Sandbox Code Playgroud)

要么

u.sval = "hi";
Run Code Online (Sandbox Code Playgroud)

里奇是什么意思?

hmj*_*mjd 8

发布的代码正在执行分配,而不是初始化.作者意味着以下是有效的初始化,因为323int和第一个成员u_tagint:

union u_tag u = { 323 }; /* Initializes u.ival. */
Run Code Online (Sandbox Code Playgroud)

以下是无效的,因为它会试图初始化一个int具有char[]:

union u_tag u = { "hi" };
Run Code Online (Sandbox Code Playgroud)

但是,由于C99不再是这种情况.在C99中,引入了指示符:

union u_tag u = { .sval = "hi" };
Run Code Online (Sandbox Code Playgroud)

在C89中,如果您想要union使用除第一个成员以外的成员的值初始化a,则可以复制现有成员union.如果你想声明unionas,这将特别有用const.例如:

union u_tag make_u_tag_with_fval(const float a_fval)
{
    union u_tag u;
    u.fval = a_fval;
    return u;
}

const union u_tag u_fval = make_u_tag_with_fval(1.0);
Run Code Online (Sandbox Code Playgroud)