2009-11-17 64 views
14

是否可以告诉预处理器检查函数(而不是宏)是否被声明?我尝试了以下方法,但看起来并不奏效:检查函数是否用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; 
} 
+0

我对此很感兴趣。您正在使用的库应该是一致的,以获得您的示例:不会有没有printf的stdio.h,并且如果printf可能在遥远的将来被删除,您现在不会知道替换是如何进行的被称为。 – flokra 2009-11-17 14:30:31

+0

我在想这不是专门针对printf的,只是任何函数名称。但是,如果你想知道函数是否存在,只需调用它 - 编译器错误会告诉你:-) – paxdiablo 2009-11-17 14:39:52

+5

我的主要动机是检查函数如bcopy()或arc4random()(编写跨平台程序时) ,这些并不总是被定义的。 – Michael 2009-11-17 14:59:39

回答

21

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

但是,大多数头文件都包含一些防护宏,如_STDIO_H_,您可以在预处理程序阶段中进行测试。但是,该解决方案不具有可移植性,因为包含的警卫宏名称不是标准化的。

0

由于预处理器不知道C/C++语言(它确实只是文本替换),所以我猜测这是不可能的。你为什么想这样做?也许有另一种方式。

1

预处理器是一个简单的程序,几乎不知道底层语言。它不能说明是否已经声明了一个函数。即使可能,函数也可能在另一个库中定义,并且符号在链接期间被解析,所以预处理器在这方面不能提供帮助。

5

如果你看看像autoconf这样的工具,你会看到他们经历了很多测试以确定计算机有或没有,正确编译,然后他们设置正确的#DEFINES。

你可能想看看那个模型,如果你对unix有些味道的话,那个工具是不可能的,因为你想做的事情是不可能的,正如其他人毫无疑问指出的那样。