事实上,如果我包含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
在这里使用?
事实上,如果我包含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
在这里使用?
这些不包括警卫。如果系统中存在相应的标头,则设置这些宏。在配置过程中检测到。如果它们被无条件包含并且它们不存在,则编译将失败。
是的,系统标头中有包含防护。看看例如“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
检查头文件可用性的脚本生成。