检查是否用C预处理器声明了函数?

是否可以告诉C预处理器检查是否声明了函数(不是宏)? 我尝试了以下方法,但它似乎不起作用:

#include  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的那种工具,那么您想要做的事情是不可能的,因为其他人无疑正在指出。

预处理器是一个简单的程序,几乎不知道底层语言。 它无法判断是否已声明某个函数。 即使可以,也可以在另一个库中定义该函数,并在链接期间解析符号,因此预处理器在这方面无法提供帮助。

严格来说不是,预处理器不能单独完成。 但是,您可以通过自动创建适当的#defines来提供一些帮助。

通常如上所述,如果在unix类型系统上,你将使用autotools。 但是,您也可以使用makefile创建相同的效果。 我最近有理由检测标题中定义的“posix_fallocate”函数,因为我使用的是uClibc,它似乎在早期版本中省略了它。 这适用于gnu make,但你可以在其他版本中使用类似的东西:

 NOFALLOC := $(shell echo "\#include \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 ++语言(它实际上只进行文本替换),我猜这是不可能的。 你为什么要这样做? 也许还有另一种方式。