检查是否用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 ++语言(它实际上只进行文本替换),我猜这是不可能的。 你为什么要这样做? 也许还有另一种方式。