0

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

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

例如,这样做是否:

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

还是不涉及清算?

4

2 回答 2

1

例如,这样做是否:

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

答:是的(但不是按这个顺序)

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

要回答这个问题,您需要查看§ 6.7.9 初始化 (p19)§ 6.7.9 初始化 (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 节初始化(p21)

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

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

仔细查看(阅读第 6.7.9 节的全部内容),如果您还有其他问题,请告诉我。

于 2021-03-18T18:58:46.873 回答
0

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

于 2021-03-18T06:00:16.190 回答