是否可以保证每个库标题看起来像这样?
#ifndef STDIO_H
#define STDIO_H
/* contents here... */
#endif
请你转介我?
谢谢!
答案 0 :(得分:8)
不,GCC不会保护您免受不使用您所描述的包含保护的库的影响 - 这取决于相关库。 (而不是海湾合作委员会的一部分。)
所有着名的C标准库(glibc,newlibc,ulibc)都能正确保护其包含。 (由于它们被广泛使用,很快就会发现这种明显的问题。)
编辑:在第二次评论之后,您的问题现在更有意义了。引自ISO / IEC 9899:1999(C99),第7.1.2章标准标题,第4段,第一句:
标准标题可以包含在任何顺序中;每个可以包含多次 一个给定的范围,没有任何效果不同于只包括一次,除了 包含< assert.h>的效果取决于NDEBUG的定义(见7.2)。
这意味着,如果您遇到任何标准C库会给您带来麻烦,那么它就会崩溃。
答案 1 :(得分:7)
C99标准(ISO / IEC 9899:TC3)明确规定:
标准标题可能包含在中 任何订单;每个都可能包含更多 在给定范围内,不是一次,没有 效果不同于被包括在内 只有一次,除了效果 包括
<assert.h>
取决于。{1}} NDEBUG的定义(见7.2)。
第7.1.2节中的第4点
答案 2 :(得分:3)
C ++标准当然指定标准库头可以多次#included。它没有指定避免多个定义的机制必须是什么。我怀疑C标准(我还没有)说出类似的东西。但是你为什么要关注这个?
答案 3 :(得分:0)
编写 autoconf 脚本,为源基础引入保护,防止多个包含头文件。我确信这将用于标准C库。
答案 4 :(得分:0)
以下是我在most recent draft中找到的最相关的部分:
6.10.2 6 - #include预处理指令可能出现在由于另一个文件中的#include指令而被读取的源文件中,直到实现定义 嵌套限制(见5.2.4.1)。
第5.2.4.1节然后列举了各种环境限制的最低要求值;对于嵌套文件包含,它是15。
如何实现这一点取决于个人实施;该标准并未强制要求使用#include警卫,尽管可以合理地假设大多数实现都是如此。