如何在C中创建初始化列表?你必须使用结构或联合吗?
因为目前我编写的代码显然存在我有多少初始化变量的问题。
编译错误: 初始值设定项的数量不能大于数字
答案 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),如果不采取其他措施(提供更多元素),再说不出话来。丢弃其他元素似乎是合法的,不编译似乎也不合法......