以下是否将列表清零然后添加第一个条目?或者它只是将第一个条目添加到handlers
?
Logger = (struct logger) {.level=INFO, .format=DEFAULT_FORMAT, .num_handlers=1, .handlers[0]=stdout};
例如,这样做是否:
Logger.handlers = {0};
Logger.handlers[0] = stdout;
还是不涉及清算?
以下是否将列表清零然后添加第一个条目?或者它只是将第一个条目添加到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}; 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 节的全部内容),如果您还有其他问题,请告诉我。
后者Logger.handlers[0] = stdout;
。这就是为什么 API 有一个 .num_handlers 字段来告诉被调用的代码知道有多少处理程序是有效的。