以下的宏用于检测特定的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在库sun'、
seq’和`gen’中分别查找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’包围你为函数提供的替代版本的原型来声明函数。 如果系统含有该函数,它可能在一个你应该引入的头文件中进行声明,所以你不应该重新声明它,以避免声明冲突。