GCC是否保护程序员免受包括C库头部在内的多个程序员的影响?

时间:2009-07-23 11:24:45

标签: c include header

是否可以保证每个库标题看起来像这样?

#ifndef STDIO_H
#define STDIO_H
/* contents here... */
#endif

请你转介我?

谢谢!

5 个答案:

答案 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警卫,尽管可以合理地假设大多数实现都是如此。