如何取消定义 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 或检查两个宏设置并断言它们是否是。
我正在编写我的 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 或检查两个宏设置并断言它们是否是。