我知道我可以使用this post来检查一组标头是否为指定的标识符提供声明,但是我如何检查是否声明了宏,以及它的扩展是否符合我的标准?具体来说,我想检查numa.h
是否包含与此等效的宏定义...
#define LIBNUMA_API_VERSION 2
...包括特定值“2”。
更新:
<numa.h>
标头包含#define LIBNUMA_API_VERSION 2
这样的定义来声明它的版本。使用此标头的C代码通常使用它:
#if defined(LIBNUMA_API_VERSION) && LIBNUMA_API_VERSION >= 2
....
#endif
我想确定带有autoconf
的NUMA标题版本,并定义一个宏,它简洁地传达了是否提供了NUMA版本2。即:
if test "$have_numa_v2" = "yes" ; then
AC_DEFINE(NUMA_VERSION_2, 1, [Determine whether NUMA v2 available)
fi
可以像这样使用:
#ifdef NUMA_VERSION_2
....
#endif
有可能吗?我无法确定如何在我的Autoconf文件中设置变量have_numa_v2
变量的值。
答案 0 :(得分:3)
您可以使用AC_COMPILE_IFELSE
或AC_RUN_IFELSE
和适当结构的测试程序来确定宏是否定义为您指定的特定值。例如,假设当前语言是C:
have_numa_v2=no
AC_RUN_IFELSE([AC_LANG_PROGRAM([
#include <numa.h>
],[
#if LIBNUMA_API_VERSION != 2
exit(1);
#endif
])], [have_numa_v2=yes])
构造一个程序,其返回值取决于LIBNUMA_API_VERSION
是否定义为宏,如果是,则是否扩展为2
。如果Autoconf无法编译它(因为,例如,它找不到numa.h)或者如果它以0以外的状态退出,则不会发生其他任何事情($have_numa_v2
保留其指定值"no"
)。否则,将执行第二个参数中的赋值,$have_numa_v2
最终将返回值"yes"
。
对于它的价值,该宏生成和使用的特定测试程序的源代码包含一些Autoconf标准宏定义,加上:
#include <numa.h>
int
main ()
{
#if LIBNUMA_API_VERSION != 2
exit(1);
#endif
;
return 0;
}
使用AC_COMPILE_IFELSE的版本类似,但使用#error
预处理程序指令构建,如果未将宏定义为指定值,则编译失败。如果您预计您的程序可能会针对外部架构进行交叉编译,那么这种变化可能是更好的选择。