在C中创建初始化列表

时间:2016-07-19 13:53:49

标签: c

如何在C中创建初始化列表?你必须使用结构或联合吗?

因为目前我编写的代码显然存在我有多少初始化变量的问题。

编译错误: 初始值设定项的数量不能大于数字

1 个答案:

答案 0 :(得分:1)

struct S
{
    int a, d, p;
};

#define S_INITIALIZER { 12, 10, 77 }

struct S s = S_INITIALIZER;

您(通常)为每个成员提供一个值。如果提供的更少,其余成员将进行零初始化(C99,6.7.8.21)。如果提供更多,则会收到编译器警告,并且会丢弃其他初始化程序值。

编辑:正如奥拉夫指出的那样(谢谢!),最好使用指定的初始值设定项:

#define S_INITIALIZER { .a = 12, .d = 10, .p = 77 }

这样,初始化程序对于与以下内容关联的结构的更改是健壮的:

struct S
{
    int d, a, o, p;
    //        ^ new value; a and d inverted!
};

仍然像以前一样初始化,o初始化为0(C99 6.7.8.19)。如果您现在删除p,则会出现编译错误 - 至少使用gcc。

实际上,标准规定:

  

如果指定人的形式为   。标识
  然后当前对象(下面定义)应具有结构或联合类型和   identifier应该是该类型成员的名称。

(C99 6.7.8.7)。但是,如果不这样做,就没有发现会发生什么。

类似地:

  

初始化程序不应尝试为未初始化的实体中包含的对象提供值。

(C99 6.7.8.2),如果不采取其他措施(提供更多元素),再说不出话来。丢弃其他元素似乎是合法的,不编译似乎也不合法......