2012-06-19 36 views
0

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

+1

'include guards'就像这样:'#ifndef XXX #define XXX #include #endif' – MYMNeo

+0

看到这个http://en.wikipedia.org/wiki/Include_guard。这将解释为什么需要包括警卫 – MYMNeo

回答

4

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

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脚本检查头文件的可用性来生成一个配置报头。