在添加条目之前对数组进行清零

Zero'ing an array before adding an entry

以下是否将列表归零然后添加第一个条目?或者它只是将第一个条目添加到 handlers?

 Logger = (struct logger) {.level=INFO, .format=DEFAULT_FORMAT, .num_handlers=1, .handlers[0]=stdout};

例如,这样做:

Logger.handlers = {0};
Logger.handlers[0] = stdout;

或者没有涉及清算?

后者Logger.handlers[0] = stdout;。这就是为什么 API 有一个 .num_handlers 字段来告诉被调用的代码知道有多少处理程序是有效的。

For example, does this do:

Logger.handlers = {0};
Logger.handlers[0] = stdout;

回答:是的(但不是特定的顺序)

C11 Standard § 6.7.9 - Initialization 部分下有三个标准部分(如果您选择专门使以下两个适用于“聚合对象”(结构和数组)的部分,则实际上是 4 个)。您的案例询问“如果在初始化期间仅向 Logger.handlers[0] = stdout; 提供值,Logger.handlers 的其他元素会发生什么情况?”

要回答这个问题,您需要查看 § 6.7.9 Initialization (p19) and § 6.7.9 Initialization (p21)

第一个指定结构的初始化如何以“列表顺序”进行,并且 "all subobjects that are not initialized explicitly shall be initialized implicitly the same as objects that have static storage duration." 因此,如果您提供的值少于所有值以完全初始化子对象,则那些未提供值的值将被初始化,就好像它们有静态存储时间。 (具有静态存储持续时间的对象,未显式初始化,初始化为零(或NULL,视类型而定),参见:§ 6.7.9 Initialization (p10)

第 21 段特别涵盖了您的情况,其中在大括号括起来的列表中提供了较少的初始值设定项 -- "all subobjects that are not initialized explicitly shall be initialized implicitly the same as objects that have static storage duration." § 6.7.9 Initialization (p21)

总而言之,Logger.handlers 的初始化实际发生的是第一个元素被初始化为 stdout,所有其他元素都被初始化为 NULL(因为 stdoutFILE* 类型的指针)。所以你实际拥有的是:

Logger.handlers[CONST] = { stdout, NULL, NULL, ... };

仔细查看(阅读所有 § 6.7.9),如果您还有其他问题,请告诉我。