以下的宏用于检测特定的C库函数。如果没有为你需要的函数定义特定的宏,而且你不需要检查它的任何特殊性质, 那么你可以使用一个通用函数检测宏。

对特定函数的检查

这些宏用于检测特定的C函数–它们是否存在,以及在某些情况下,当给出了特定的参数时,它们是如何响应的。

  • 宏: AC_FUNC_ALLOCA
    检测如何获得alloca。本宏试图通过检查alloca.h或者预定义C预处理器宏 __GNUC___AIX来获得alloca的内置(builtin)版本。 如果本宏找到了alloca.h,它就定义HAVE_ALLOCA_H。
    如果上述尝试失败了,本宏就在标准C库中寻找函数。如果下列任何方法成功了,本宏就定义HAVE_ALLOCA。 否则,它把输出变量ALLOCA设置成alloca.o并且定义C_ALLOCA (这样程序就可以周期性地调用alloca(0)以进行垃圾的收集)。本变量是从LIBOBJS中 分离出来的,因此在只有一部分程序使用LIBOBJS中的代码时,多个程序就可以不必创建实际的库而 共享ALLOCA的值。
    本宏并不试图从System V R3的libPW中,或者从System V R4的libucb中获取alloca, 这是因为这些库包含了一些造成麻烦的不兼容的函数。有些版本甚至不含有alloca或者含有带bug的版本。 如果你仍然需要使用它们的alloca,用ar把alloca.o从这些库中提取出来, 而不是编译alloca.c
    使用alloca的源文件应该以如下一段代码开头,以正确地声明它。在某些AIX版本中,对alloca 的声明必须在除了注释和预处理指令之前的任何东西之前出现。#pragma指令被缩进(indented),以便让 预标准C编译器(pre-ANSI C compiler)忽略它,而不是导致错误(choke on it)。

    /* AIX requires this to be the first thing in the file.  */
    #ifndef __GNUC__
    # if HAVE_ALLOCA_H
    #  include <alloca.h>
    # else
    #  ifdef _AIX
    #pragma alloca
    #  else
    #   ifndef alloca /* predefined by HP cc +Olibcalls */
    char *alloca ();
    #   endif
    #  endif
    # endif
    #endif
  • 宏: AC_FUNC_CLOSEDIR_VOID
    如果函数closedir不返回有意义的值,就定义CLOSEDIR_VOID。否则,调用者就应该 把它的返回值作为错误指示器来进行检查。

  • 宏: AC_FUNC_FNMATCH
    如果可以使用fnmatch函数,并且能够工作(不象SunOS 5.4中的fnmatch那样), 就定义HAVE_FNMATCH。

  • 宏: AC_FUNC_GETLOADAVG
    检查如何才能获得系统平均负载。如果系统含有getloadavg函数,本宏就定义HAVE_GETLOADAVG, 并且把为了获得该函数而需要的库添加到LIBS中。
    否则,它就把getloadavg.o添加到输出变量LIBOBJS之中,并且可能定义几个其他的C预处理器 宏和输出变量:
    如果在相应的系统中,就根据系统类型定义宏SVR4、DGUX、UMAX或者UMAX4_3。
    如果它找到了nlist.h,就定义NLIST_STRUCT。
    如果结构struct nlist含有成员n_un,就定义NLIST_NAME_UNION。
    如果在编译getloadavg.c时定义了LDAV_PRIVILEGED,为了使getloadavg能够 工作,程序就必须特殊地安装在系统中,并且本宏定义GETLOADAVG_PRIVILEGED。
    本宏设置输出变量NEED_SETGID。如果需要进行特别的安装,它的值就是true,否则 值就是false。如果NEED_SETGID为true,本宏把KMEM_GROUP 设置成将拥有被安装的程序的组(group)的名字。

  • 宏: AC_FUNC_GETMNTENT
    为Irix 4、PTX和Unixware在库sunseqgen中分别查找getmntent函数。 那么,如果可以使用getmntent,就定义HAVE_GETMNTENT。
  • 宏: AC_FUNC_GETPGRP
    如果getpgrp不接受参数(POSIX.1版),就定义GETPGRP_VOID。否则,它就是一个把 进程ID作为参数的BSD版本。本宏根本不检查getpgrp是否存在;如果你需要检查它的存在性,就首先为 getpgrp函数调用AC_CHECK_FUNC。
  • 宏: AC_FUNC_MEMCMP
    如果不能使用memcmp函数,或者不能处理8位数据(就像SunOS 4.1.3中的那样),就把memcmp.o添加到输出变量LIBOBJS中去。
  • 宏: AC_FUNC_MMAP
    如果函数mmap存在并且能够正确地工作,就定义HAVE_MMAP。只检查已经映射(already-mapped) 的内存的私有固定映射(private fixed mapping)。
  • 宏: AC_FUNC_SELECT_ARGTYPES
    确定函数select的每个参数的正确类型,并且把这些类型分别定义成SELECT_TYPE_ARG1、 SELECT_TYPE_ARG234和SELECT_TYPE_ARG5。SELECT_TYPE_ARG1的缺省值 是int,SELECT_TYPE_ARG234的缺省值是int *, SELECT_TYPE_ARG5的缺省值是struct timeval *
  • 宏: AC_FUNC_SETPGRP
    如果setpgrp不接受参数(POSIX.1版),就定义SETPGRP_VOID。否则,该函数就是一个 把两个进程ID作为参数的BSD版本。本宏并不检查函数setpgrp是否存在;如果你需要检查该函数的存在 性,就首先为setpgrp调用AC_CHECK_FUNC。
  • 宏: AC_FUNC_SETVBUF_REVERSED
    如果函数setvbuf的第二个参数是缓冲区的类型并且第三个参数是缓冲区指针,而不是其他形式, 就定义SETVBUF_REVERSED。这是在System V第3版以前的情况。
  • 宏: AC_FUNC_STRCOLL
    如果函数strcoll存在并且可以正确地工作,就定义HAVE_STRCOLL。 由于有些系统包含了错误定义的strcoll,这时就不应该使用strcoll, 因此本宏要比AC_CHECK_FUNCS(strcoll)多作一些检查。
  • 宏: AC_FUNC_STRFTIME
    对于SCO UNIX,在库intl中查找strftime。而后,如果可以使用strftime, 就定义HAVE_STRFTIME。
  • 宏: AC_FUNC_UTIME_NULL
    如果utime(file, NULL)把file的时间标记设置成现在,就定义 HAVE_UTIME_NULL。
  • 宏: AC_FUNC_VFORK
    如果找到了vfork.h,就定义HAVE_VFORK_H。如果找不到可以工作的vfork, 就把vfork定义成fork。本宏检查一些已知的vfork实现中的错误 并且认为如果vfork的实现含有任何一个错误,系统就不含有可以工作的vfork。 由于子进程很少改变它们的信号句柄(signal handler),所以如果子进程的signal调用(invocation) 修改了父进程的信号句柄,将不会被当作实现的错误。
  • 宏: AC_FUNC_VPRINTF
    如果找到了vprintf,就定义HAVE_VPRINTF。否则,如果找到了doprnt, 就定义HAVEDOPRNT。(如果可以使用vprintf,你就可以假定也可以使用vfprintf 和vsprintf。)
  • 宏: AC_FUNC_WAIT3
    如果找到了wait3并且该函数填充它的第三个参数的内容(struct rusage *), 就定义HAVE_WAIT3。在HP-UX中,该函数并不这样做。

对普通函数的检查

这些宏被用于寻找没有包括在特定函数测试宏中的函数。如果函数可能出现在除了缺省C库以外的库中,就 要首先为这些库调用AC_CHECK_LIB。如果你除了需要检查函数是否存在之外,还要检查函数 的行为,你就不得不为此而编写你自己的测试(参见编写测试)。

  • 宏: AC_CHECK_FUNC (function, [action-if-found [, action-if-not-found]])
    如果可以使用C函数function,就运行shell命令action-if-found,否则运行 action-if-not-found。如果你只希望在函数可用的时候定义一个符号,就考虑使用 AC_CHECK_FUNCS。由于C++比C更加标准化,即使在调用了AC_LANG_CPLUSPLUS 的时候,本宏仍然用C的连接方式对函数进行检查。(关于为测试选择语言的详情,请参见 对语言的选择)
  • 宏: AC_CHECK_FUNCS (function… [, action-if-found [, action-if-not-found]])
    对于每个在以空格分隔的函数列表function中出现的函数,如果可用,就定义HAVE_function (全部大写)。如果给出了action-if-found,它就是在找到一个函数的时候执行的附加的shell代码。你可以给出break以便在找到第一个匹配的时候跳出循环。如果给出了action-if-not-found,它就在找不到 某个函数的时候执行。
  • 宏: AC_REPLACE_FUNCS (function…)
    本宏的功能就类似于以将function.o添加到输出变量LIBOBJS的shell 代码为参数action-if-not-found,调用AC_CHECK_FUNCS。你可以通过用#ifndef HAVE_function包围你为函数提供的替代版本的原型来声明函数。 如果系统含有该函数,它可能在一个你应该引入的头文件中进行声明,所以你不应该重新声明它,以避免声明冲突。