gpt4 book ai didi

在 C 中创建初始化列表

转载 作者:行者123 更新时间:2023-11-30 21:37:04 24 4
gpt4 key购买 nike

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

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

编译错误:初始化器的数量不能大于数量

最佳答案

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

#define S_INITIALIZER { 12, 10, 77 }

struct S s = S_INITIALIZER;

您(通常)为每个成员提供一个值。如果您提供的较少,则其余成员将被零初始化(C99,6.7.8.21)。如果您提供更多,您将收到编译器警告,并且附加的初始值设定项值将被丢弃。

编辑:正如 Olaf 指出的(谢谢!),最好使用指定的初始值设定项:

#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来说是这样。

实际上,该标准规定:

If a designator has the form
   . identifier
then the current object (defined below) shall have structure or union type and the identifier shall be the name of a member of that type.

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

同样:

No initializer shall attempt to provide a value for an object not contained within the entity being initialized.

(C99 6.7.8.2),如果不这样做(提供更多元素),同样没有任何文字。丢弃附加元素似乎是合法的,不编译似乎也不违法......

关于在 C 中创建初始化列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38460594/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com