我正在编写我的configure.ac
脚本,并且有一些自定义启用参数,如果启用,它们会在我的C代码中定义宏。一个例子:
AC_ARG_ENABLE([example],
AS_HELP_STRING([--enable-example], [This is an example]))
AS_IF([test "x$enable_example" = "xyes"], [
AC_DEFINE(EXAMPLE_MACRO, 1, [This is a definition example])
])
现在说我有一个启用选项,如果启用,必须禁用--enable-example
选项的效果。我有正常的设置:
AC_ARG_ENABLE([another-feature],
AS_HELP_STRING([--another-feature], [This is a feature which enables something, but disables --enable-example]))
AS_IF([test "x$enable_another_feature" = "xyes"], [
AC_DEFINE(ANOTHER_FEATURE_MACRO, 1, [This is another feature definition])
])
现在我需要能够取消定义EXAMPLE_MACRO
宏,但我找不到任何撤消AC_DEFINE
的内容。我错过了什么吗?
答案 0 :(得分:1)
为什么不简单地延迟AC_DEFINE
函数调用?请注意,我不是AS_IF
宏的忠实拥护者。
if test "x$enable_another_feature" = xyes ; then
# enable_example="no" # (optional)
AC_DEFINE([ANOTHER_FEATURE_MACRO], [1])
elif test "x$enable_example" = xyes ; then
AC_DEFINE([EXAMPLE_MACRO], [1])
fi
如果未执行AC_DEFINE
,则在配置标头中未实例化相应的#define ...
。讨论过here。
答案 1 :(得分:0)
如果您的示例中使用的是布尔型符号,则只需启用标志或禁用即可,您需要做的就是再次调用AC_DEFINE来禁用该符号:
AC_DEFINE(EXAMPLE_MACRO, 0)
该符号将仍然存在,但新值为0(布尔值false)。
更新: 为了完成答案,如果指定了冲突的选项,通常的做法是在编译过程中以错误终止。当您定义符号时,并且config.h.in包含#undef EXAMPLE_MACRO,AC_DEFINE会将其转为#define EXAMPLE_MACRO。因此,您可以使用两个选项来处理这样的宏,检查其值是否设置为1/0,或者检查两个宏的设置并断言它们是否为真。