下列宏检查某些C头文件是否存在。如果没有为你需要检查的头文件定义特定的宏,而且你不需要检查它的任何特殊 属性,那么你就可以使用一个通用的头文件检查宏。

对特定头文件的检查
这些宏检查特定的系统头文件–它们是否存在,以及在某些情况下它们是否定义了特定的符号。

宏: AC_DECL_SYS_SIGLIST
如果在系统头文件,signal.h'或者unistd.h’,中定义了变量sys_siglist, 就定义SYS_SIGLIST_DECLARED。

宏: AC_DIR_HEADER
类似于调用AC_HEADER_DIRENT和AC_FUNC_CLOSEDIR_VOID,但为了指明找到了 哪个头文件而定义了不同的一组C预处理器宏。本宏和它定义的名字是过时的。它定义的名字是:

dirent.h' DIRENTsys/ndir.h’
SYSNDIR
sys/dir.h' SYSDIRndir.h’
NDIR
此外,如果closedir不能返回一个有意义的值,就定义VOID_CLOSEDIR。

宏: AC_HEADER_DIRENT
对下列头文件进行检查,并且为第一个找到的头文件定义`DIR’,以及列出的C预处理器宏:

dirent.h' HAVE_DIRENT_Hsys/ndir.h’
HAVE_SYS_NDIR_H
sys/dir.h' HAVE_SYS_DIR_Hndir.h’
HAVE_NDIR_H
源代码中的目录库声明应该以类似于下面的方式给出:

#if HAVE_DIRENT_H

include <dirent.h>

define NAMLEN(dirent) strlen((dirent)->d_name)

#else

define dirent direct

define NAMLEN(dirent) (dirent)->d_namlen

if HAVE_SYS_NDIR_H

include <sys/ndir.h>

endif

if HAVE_SYS_DIR_H

include <sys/dir.h>

endif

if HAVE_NDIR_H

include <ndir.h>

endif

#endif
使用上述声明,程序应该把变量定义成类型struct dirent,而不是struct direct,并且应该 通过把指向struct direct的指针传递给宏NAMLEN来获得目录项的名称的长度。

本宏还为SCO Xenix检查库dir'和x’。

宏: AC_HEADER_MAJOR
如果sys/types.h'没有定义major、minor和makedev, 但sys/mkdev.h’定义了它们,就定义MAJOR_IN_MKDEV; 否则,如果`sys/sysmacros.h’定义了它们,就定义MAJOR_IN_SYSMACROS。

宏: AC_HEADER_STDC
如果含有标准C(ANSI C)头文件,就定义STDC_HEADERS。 特别地,本宏检查stdlib.h'、stdarg.h’、string.h'和float.h’; 如果系统含有这些头文件,它可能也含有其他的标准C头文件。本宏还检查string.h'是否定义了memchr (并据此对其他mem函数做出假定),stdlib.h’是否定义了free(并据此 对malloc和其他相关函数做出假定),以及`ctype.h’宏是否按照标准C的要求而可以 用于被设置了高位的字符。

因为许多含有GCC的系统并不含有标准C头文件,所以用STDC_HEADERS而不是STDC 来决定系统是否含有服从标准(ANSI-compliant)的头文件(以及可能的C库函数)。

在没有标准C头文件的系统上,变种太多,以至于可能没有简单的方式对你所使用的函数进行定义以 使得它们与系统头文件声明的函数完全相同。某些系统包含了ANSI和BSD函数的混合;某些基本上是标准(ANSI) 的,但缺少memmove';有些系统在string.h’或者strings.h'中以宏的方式 定义了BSD函数;有些系统除了含有string.h’之外,只含有BSD函数;某些系统在memory.h' 中定义内存函数,有些在string.h’中定义;等等。对于一个字符串函数和一个内存函数的检查可能 就够了;如果库含有这些函数的标准版,那么它就可能含有其他大部分函数。如果你在`configure.in’ 中安放了如下代码:

AC_HEADER_STDC
AC_CHECK_FUNCS(strchr memcpy)
那么,在你的代码中,你就可以像下面那样放置声明:

#if STDC_HEADERS

include <string.h>

#else

ifndef HAVE_STRCHR

define strchr index

define strrchr rindex

endif

char *strchr (), *strrchr ();

ifndef HAVE_MEMCPY

define memcpy(d, s, n) bcopy ((s), (d), (n))

define memmove(d, s, n) bcopy ((s), (d), (n))

endif

#endif
如果你使用没有等价的BSD版的函数,诸如memchr、memset、strtok 或者strspn,那么仅仅使用宏就不够了;你必须为每个函数提供一个实现。以memchr为例, 一种仅仅在需要的时候(因为系统C库中的函数可能经过了手工优化)与你的实现协作的简单方式是把实现放入 memchr.c'并且使用AC_REPLACE_FUNCS(memchr)’。

宏: AC_HEADER_SYS_WAIT
如果sys/wait.h'存在并且它和POSIX.1相兼容,就定义HAVE_SYS_WAIT_H。 如果sys/wait.h’不存在,或者如果它使用老式BSD union wait,而不是 int来储存状态值,就可能出现不兼容。如果`sys/wait.h’不与POSIX.1兼容, 那就不是引入该头文件,而是按照它们的常见解释定义POSIX.1宏。下面是一个例子:

#include <sys/types.h>

#if HAVE_SYS_WAIT_H

include <sys/wait.h>

#endif

#ifndef WEXITSTATUS

define WEXITSTATUS(stat_val) ((unsigned)(stat_val) >> 8)

#endif

#ifndef WIFEXITED

define WIFEXITED(stat_val) (((stat_val) & 255) == 0)

#endif

宏: AC_MEMORY_H
string.h'中,如果没有定义memcpy, memcmp等函数,并且memory.h’ 存在,就定义NEED_MEMORY_H。本宏已经过时;可以用AC_CHECK_HEADERS(memory.h)来代替。 参见为AC_HEADER_STDC提供的例子。

宏: AC_UNISTD_H
如果系统含有unistd.h',就定义HAVE_UNISTD_H。本宏已经过时;可以用AC_CHECK_HEADERS(unistd.h)’来代替。

检查系统是否支持POSIX.1的方式是:

#if HAVE_UNISTD_H

include <sys/types.h>

include <unistd.h>

#endif

#ifdef POSIXVERSION
/* Code for POSIX.1 systems. */

#endif
在POSIX.1系统中包含了unistd.h'的时候定义_POSIX_VERSION。 如果系统中没有unistd.h’,那么该系统就一定不是POSIX.1系统。但是,有些非POSIX.1(non-POSIX.1) 系统也含有`unistd.h’。

宏: AC_USG
如果系统并不含有strings.h'、rindex、bzero等头文件或函数,就定义USG。 定义USG就隐含地表明了系统含有string.h’、strrchr、memset等头文件或函数。

符号USG已经过时了。作为本宏的替代,参见为AC_HEADER_STDC提供的例子。

对普通头文件的检查
这些宏被用于寻找没有包括在特定测试宏中的系统头文件。如果你除了检查头文件是否存在之外还要检查它的内容, 你就不得不为此而编写你自己的测试(参见编写测试)。

宏: AC_CHECK_HEADER (header-file, [action-if-found [, action-if-not-found]])
如果系统头文件header-file存在,就执行shell命令action-if-found, 否则执行action-if-not-found。如果你只需要在可以使用头文件的时候定义一个符号,就考虑使用 AC_CHECK_HEADERS。

宏: AC_CHECK_HEADERS (header-file… [, action-if-found [, action-if-not-found]])
对于每个在以空格分隔的参数列表header-file出现的头文件,如果存在,就定义 HAVE_header-file(全部大写)。如果给出了action-if-found, 它就是在找到一个头文件的时候执行的附加shell代码。你可以把`break’作为它的值 以便在第一次匹配的时候跳出循环。如果给出了action-if-not-found,它就在找不到 某个头文件的时候被执行。