gpt4 book ai didi

使用 autoconf 检查 C#define 的值

转载 作者:太空宇宙 更新时间:2023-11-04 06:54:39 25 4
gpt4 key购买 nike

我知道我可以使用 AC_CHECK_DECL / AC_CHECK_DECLS检查一组 header 是否为指定标识符提供了声明,但是我如何不仅可以检查是否声明了宏,还可以检查它的扩展是否符合我的标准?具体来说,我想检查是否 numa.h包含等效于此的宏定义...

#define LIBNUMA_API_VERSION 2

...包括特定值“2”。

更新: <numa.h> header 包含诸如 #define LIBNUMA_API_VERSION 2 之类的定义声明它的版本。使用此 header 的 C 代码通常像这样使用它:

#if defined(LIBNUMA_API_VERSION) && LIBNUMA_API_VERSION >= 2
....
#endif

我想用 autoconf 确定 NUMA header 版本, 并定义一个宏来简洁地传达是否提供 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

这可能吗?我无法确定如何设置变量 have_numa_v2 的值我的 Autoconf 文件中的变量。

最佳答案

您可以使用 AC_COMPILE_IFELSEAC_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 保留其分配的 值”没有”)。否则,将执行第二个参数中的赋值,并且 $have_numa_v2 以值 "yes" 结束。

就其值(value)而言,由该宏生成和使用的特定测试程序的源代码包含一些 Autoconf 标准宏定义,以及:

#include <numa.h>

int
main ()
{

#if LIBNUMA_API_VERSION != 2
exit(1);
#endif

;
return 0;
}

使用 AC_COMPILE_IFELSE 的版本会类似,但围绕使用 #error 预处理器指令构建,如果宏未定义为指定值,编译将失败。如果您预计您的程序可能会针对外国架构进行交叉编译,那么该变体可能是更好的选择。

关于使用 autoconf 检查 C#define 的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46704731/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com