对一个特征的检测的常见回应是定义一个表示测试结果的C预处理器符号。这是通过调用AC_DEFINE 或者AC_DEFINE_UNQUOTED来完成的。
在缺省状态下,AC_OUTPUT把由这些宏定义的符号放置到输出变量DEFS中,该变量为每个 定义了的符号添加一个选项`-Dsymbol=value’。与Autoconf第1版不同,在运行时 不定义DEFS变量。为了检查Autoconf宏是否已经定义了某个C预处理器符号,就检查适当的缓存变量的值, 例子如下:
AC_CHECK_FUNC(vprintf, AC_DEFINE(HAVE_VPRINTF))
if test “$ac_cv_func_vprintf” != yes; then
AC_CHECK_FUNC(doprnt, ACDEFINE(HAVE_DOPRNT))
fi
如果已经调用了AC_CONFIG_HEADER,那么就不是创建DEFS,而是由AC_OUTPUT 创建一个头文件,这是通过在一个暂时文件中把正确的值替换到#define语句中来实现的。 关于这种输出的详情,请参见配置头文件。
宏: AC_DEFINE (variable [, value [, description]])
定义C预处理器变量variable。如果给出了value,就把variable设置成那个值(不加任何改变), 否则的话就设置为1。value不应该含有新行,同时如果你没有使用AC_CONFIG_HEADER,它就不应该含有 任何#'字符,这是因为make将删除它们。为了使用shell变量(你需要使用该变量定义一个包含了 m4引用字符
[‘或者]'的值),就使用AC_DEFINE_UNQUOTED。只有在 你使用AC_CONFIG_HEADER的时候,description才有用。在这种情况下,description被 作为注释放置到生成的
config.h.in’的宏定义之前;不必在acconfig.h'中提及该宏。下面的例子把 C预处理器变量EQUATION的值定义成常量字符串
“$a > $b”‘:
AC_DEFINE(EQUATION, “$a > $b”)
宏: AC_DEFINE_UNQUOTED (variable [, value [, description]])
类似于AC_DEFINE,但还要对variable和value进行三种shell替换(每种替换只进行一次): 变量扩展($'),命令替换(`
‘),以及反斜线传义符(`')。值中的单引号和双引号 没有特殊的意义。在variable或者value是一个shell变量的时候用本宏代替AC_DEFINE。例如:
AC_DEFINE_UNQUOTED(config_machfile, “${machfile}”)
AC_DEFINE_UNQUOTED(GETGROUPS_T, $ac_cv_type_getgroups)
AC_DEFINE_UNQUOTED(${ac_tr_hdr})
由于Bourne shell在语法上的特异性,不要用分号来分隔对AC_DEFINE或者AC_DEFINE_UNQUOTED的调用和 其它的宏调用或者shell代码;这将在最终的configure脚本中导致语法错误。你既可以使用空格,也可以使用 换行。就是这样:
AC_CHECK_HEADER(elf.h, AC_DEFINE(SVR4) LIBS=”$LIBS -lelf”)
或者:
AC_CHECK_HEADER(elf.h,
AC_DEFINE(SVR4)
LIBS=”$LIBS -lelf”)
而不是:
AC_CHECK_HEADER(elf.h, AC_DEFINE(SVR4); LIBS=”$LIBS -lelf”)