标准标头/库中是不是包含保护?

Posted

技术标签:

【中文标题】标准标头/库中是不是包含保护?【英文标题】:Are there include guards in the standard headers/libraries?标准标头/库中是否包含保护? 【发布时间】:2012-06-19 13:48:25 【问题描述】:

事实上,如果我将stdlib.h 包含在我程序的每个文件中,我就不会收到重新定义错误。所以,答案是肯定的。对?

我正在阅读libxml2源代码,在htmlparser.c中有这部分:

#include <string.h>
#ifdef HAVE_CTYPE_H
#include <ctype.h>
#endif
#ifdef HAVE_STDLIB_H
#include <stdlib.h>
#endif

我的问题是:为什么在这里使用include guards

【问题讨论】:

include guards 是这样的:#ifndef XXX #define XXX #include &lt;XXX.h&gt; #endif 见en.wikipedia.org/wiki/Include_guard。它将解释为什么需要包括警卫 【参考方案1】:

这些不包括警卫。如果系统中存在相应的标头,则设置这些宏。在配置过程中检测到。如果它们被无条件包含并且它们不存在,则编译将失败。

【讨论】:

【参考方案2】:

是的,系统标头中有包含保护。看看例如在“字符串.h”:

/* Excerpt from GCC string.h */
/*
 *  ISO C99 Standard: 7.21 String handling  <string.h>
 */

#ifndef _STRING_H
#define _STRING_H   1

定义

HAVE_CTYPE_H
HAVE_STDLIB_H

通常来自配置标头,该标头可能使用./configure 脚本生成,该脚本检查头文件的可用性。

【讨论】:

以上是关于标准标头/库中是不是包含保护?的主要内容,如果未能解决你的问题,请参考以下文章

使用 HTTPS,URL 和请求标头是不是像请求正文一样受到保护?

是否可以在 C 中创建“变量”标头保护名称?

#import 是 C++11 标准的一部分吗?

将 REST 服务的 CSRF 令牌作为 Http 响应标头包含在内是不是安全?

C 标准库中的头文件可以包含另一个头文件吗?

保护来自 Inspect 元素的 Ajax 请求中的授权标头