标准标题/库中是否包含警卫?

时间:2012-06-19 13:48:25

标签: c include-guards

事实上,如果我将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

2 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:3)

是的,系统标题中包含警戒。看看,例如在“string.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脚本生成,该脚本会检查标头文件的可用性。