标准标头/库中是不是包含保护?
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 <XXX.h> #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 和请求标头是不是像请求正文一样受到保护?