下列宏检查某些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'
DIRENT
sys/ndir.h’
SYSNDIRsys/dir.h'
SYSDIR
ndir.h’
NDIR
此外,如果closedir不能返回一个有意义的值,就定义VOID_CLOSEDIR。
宏: AC_HEADER_DIRENT
对下列头文件进行检查,并且为第一个找到的头文件定义`DIR’,以及列出的C预处理器宏:
dirent.h'
HAVE_DIRENT_H
sys/ndir.h’
HAVE_SYS_NDIR_Hsys/dir.h'
HAVE_SYS_DIR_H
ndir.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,它就在找不到 某个头文件的时候被执行。