下列宏检查某些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`
    SYSNDIR
    `sys/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_H
    `sys/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检查库dirx

  • 宏: 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.hstdarg.hstring.hfloat.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,它就在找不到 某个头文件的时候被执行。