Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
检查是否使用C预处理器声明函数?_C_Macros_C Preprocessor - Fatal编程技术网

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

检查是否使用C预处理器声明函数?,c,macros,c-preprocessor,C,Macros,C Preprocessor,是否可以告诉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;
}
#包括
内部主(空)
{
#如果已定义(printf)
printf(“您支持printf!\n”);
#否则
puts(“要么你不支持printf,要么这个测试不起作用。”);
#恩迪夫
返回0;
}

否。预处理器在C编译器和C编译器处理函数声明之前运行。预处理器仅用于文本处理


但是,大多数头文件都包含可以在预处理器阶段测试的保护宏,如
\u STDIO\u H
。但是,由于include-guard宏名称未标准化,该解决方案不可移植。

因为预处理器不知道C/C++语言(它实际上只进行文本替换),我想这是不可能的。你为什么要这样做?也许还有另一种方法。

预处理器是一个简单的程序,对底层语言几乎一无所知。它无法判断函数是否已声明。即使可以,函数也可能在另一个库中定义,并且符号在链接过程中被解析,因此预处理器在这方面帮不上忙。

如果您查看autoconf之类的工具,您会发现它们会通过许多测试来确定计算机有什么或没有什么,以便正确编译,然后他们设置了正确的定义


如果您使用的是某种风格的unix,那么您可能需要查看该模型和该工具,因为您想要做的事情是不可能的,正如其他人无疑指出的那样。

严格来说,不,预处理器不能单独做这件事。但是,您可以通过自动创建适当的#定义来给它一些帮助

通常如上所述,如果在unix类型的系统上,您会使用自动工具。但是,也可以使用makefile创建相同的效果。我最近有理由检测到头文件中定义的“posix_fallocate”函数,因为我使用的是uClibc,在早期版本中似乎忽略了它。这在gnu make中起作用,但在其他版本中,您可能会得到类似的结果:

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
NOFALLOC:=$(shell echo“\\\35; include\nint main(){posix\u 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
恩迪夫

我对原因很感兴趣。您正在使用的libs应该是一致的,以举个例子:没有printf就不会有stdio.h,如果printf可能在遥远的将来被删除,您现在不知道如何调用替换项。我认为它不是专门针对printf的,只是任何函数名。但是,如果你想知道函数是否存在,只需调用它-编译器错误会告诉你:-)我的主要动机是检查像bcopy()或arc4random()这样的函数(在编写跨平台程序时),它们并不总是定义的。有些机器有“空白”函数,有些没有。我不知道它的定义是什么。这会很好,但唉。编辑:原来是readline/chardefs.h中的一个宏。为了完整起见,我现在想这样做,因为Ubuntu 20.04 apt存储库上的
libcmocka dev
似乎没有实际显示
assert\u float\u equal
的符号。