【问题标题】:How to undefine a macro in configure.ac如何在 configure.ac 中取消定义宏
【发布时间】:2015-11-04 10:29:50
【问题描述】:

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

【问题讨论】:

    标签: autoconf


    【解决方案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。

    【讨论】:

      【解决方案2】:

      对于像您的示例中的布尔类型符号,您只需启用或禁用标志,您只需要再次调用 AC_DEFINE 即可禁用该符号:

      AC_DEFINE(EXAMPLE_MACRO, 0)
      

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多