下列宏检查某些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预处理器宏。本宏和它定义的名字是过时的。它定义的名字是:
此外,如果closedir不能返回一个有意义的值,就定义VOID_CLOSEDIR。`dirent.h` DIRENT `sys/ndir.h` SYSNDIR `sys/dir.h` SYSDIR `ndir.h` NDIR
- 宏: AC_HEADER_DIRENT
对下列头文件进行检查,并且为第一个找到的头文件定义`DIR’,以及列出的C预处理器宏:
源代码中的目录库声明应该以类似于下面的方式给出:`dirent.h' HAVE_DIRENT_H `sys/ndir.h' HAVE_SYS_NDIR_H `sys/dir.h' HAVE_SYS_DIR_H `ndir.h' HAVE_NDIR_H
使用上述声明,程序应该把变量定义成类型struct dirent,而不是struct direct,并且应该 通过把指向struct direct的指针传递给宏NAMLEN来获得目录项的名称的长度。#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
本宏还为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 _POSIX_VERSION
/* Code for POSIX.1 systems. */
#endif
在POSIX.1系统中包含了unistd.h
的时候定义POSIXVERSION。 如果系统中没有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,它就在找不到 某个头文件的时候被执行。