在添加条目之前对数组进行清零
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(因为 stdout
是FILE*
类型的指针)。所以你实际拥有的是:
Logger.handlers[CONST] = { stdout, NULL, NULL, ... };
仔细查看(阅读所有 § 6.7.9),如果您还有其他问题,请告诉我。
以下是否将列表归零然后添加第一个条目?或者它只是将第一个条目添加到 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(因为 stdout
是FILE*
类型的指针)。所以你实际拥有的是:
Logger.handlers[CONST] = { stdout, NULL, NULL, ... };
仔细查看(阅读所有 § 6.7.9),如果您还有其他问题,请告诉我。