如何解决在添加条目之前将数组清零
以下是否将列表清零,然后添加第一个条目?还是只是将第一个条目添加到 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 Initialization (p19) 和 § 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,... };
再看一遍(阅读 § 6.7.9 的全部内容),如果您还有其他问题,请告诉我。
,后者Logger.handlers[0] = stdout;
。这就是为什么 API 有一个 .num_handlers 字段来告诉被调用的代码知道有多少处理程序是有效的。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。