有没有可能告诉C预处理器检查一个函数(而不是宏)是否已声明?我尝试了以下代码,但似乎没有起作用:
#include <stdio.h>
int main(void)
{
#if defined(printf)
printf("You support printf!\n");
#else
puts("Either you don't support printf, or this test doesn't work.");
#endif
return 0;
}
有没有可能告诉C预处理器检查一个函数(而不是宏)是否已声明?我尝试了以下代码,但似乎没有起作用:
#include <stdio.h>
int main(void)
{
#if defined(printf)
printf("You support printf!\n");
#else
puts("Either you don't support printf, or this test doesn't work.");
#endif
return 0;
}
没有预处理器在C编译器之前运行,而C编译器负责处理函数声明。预处理器只存在于文本处理中。
然而,大多数头文件都有包含宏卫士(如_STDIO_H_
),您可以在预处理阶段进行测试。但是,该解决方案不具备可移植性,因为包含宏卫士名称未经过标准化。
如果你看过像autoconf这样的工具,你会发现它们经过许多测试来确定计算机有什么或没有什么,以正确编译,然后设置正确的 #DEFINES。
如果你在某个Unix系统上,可能需要看看那个模型和工具,因为其他人无疑正在指出,你想要做的事情是不可能的。
NOFALLOC := $(shell echo "\#include <fcntl.h>\nint main() { posix_fallocate(0,0,0);}" | $(CC) -o /dev/null -Werror -xc - >/dev/null 2>/dev/null && echo 0 || echo 1)
ifeq "$(NOFALLOC)" "1"
DFLAGS += -DNO_POSIX_FALLOCATE
endif
由于预处理器不了解C/C++语言(它只是进行文本替换),我猜想这是不可能的。你为什么想要这样做?也许有其他方法。
libcmocka-dev
似乎没有公开assert_float_equal
符号。 - dddJewelsbbb