4

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

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

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

union u_tag {
  int ival;
  float fval;
  char *sval;
} u;

我不知道如何理解这一点。什么意思,初始化u必须为:

u.ival = 323;

显然,情况并非如此,因为我可以初始化u为:

u.fval = 1.0;

或者

u.sval = "hi";

里奇是什么意思?

4

1 回答 1

8

发布的代码正在执行分配,而不是初始化。作者的意思是,以下是有效的初始化,因为323是 anint并且第一个成员u_tag是 an int

union u_tag u = { 323 }; /* Initializes u.ival. */

以下内容将是无效的,因为它将尝试int使用 a 初始化 a char[]

union u_tag u = { "hi" };

但是,从 C99 开始,情况不再如此。在 C99 中,引入了代号:

union u_tag u = { .sval = "hi" };

在 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);
于 2012-12-12T14:41:16.963 回答