如何取消定义 configure.ac 中的宏

How to undefine a macro in configure.ac

我正在编写我的 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。我错过了什么吗?

为什么不简单地延迟 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

如果像您的示例中的布尔类型符号,您只需启用标志或禁用,您只需再次调用 AC_DEFINE 来禁用该符号:

AC_DEFINE(EXAMPLE_MACRO, 0)

符号仍然存在,但新值为 0(布尔值 false)。

更新: 要完成答案,如果指定了冲突选项,通常的做法是在编译期间因错误而终止。当你定义一个符号时,config.h.in 包含#undef EXAMPLE_MACRO,AC_DEFINE 将把它变成#define EXAMPLE_MACRO。所以你有两个选项来使用这样的宏,检查它的值是否设置为 1/0 或检查两个宏设置并断言它们是否是。