#ifdef(或其他预处理器指令)是否适用于函数声明(以测试函数存在性)?

为什么以下代码不能按预期工作?

void foobar(int); #ifndef foobar printf("foobar exists"); #endif 

总是打印信息; 它显然无法检测到一个函数作为一个实体的存在。 (这是一个过载的问题吗?)

为什么#ifdef (或其变体)不能检测函数声明? 声明应该在预处理时可用,所以它应该有效,不应该吗? 如果没有,是否有替代方案或解决方法?

声明应该在预处理时可用,所以它应该有效,不应该吗?

预处理器在编译之前运行(因此是“pre”),因此在那一点上没有编译的符号,只是文本和文本扩展。 除了预处理器修改传递给编译器的源这一事实之外,预处理器和编译器明显是分开的并且彼此独立工作。

使用预处理器执行某些操作的典型模式是使用相同的define常量将函数声明与函数用法配对:

 #define FOO #ifdef FOO void foo(int); #endif #ifdef FOO printf("foo exists"); #endif 

预处理器对使用预处理器指令定义的预处理器令牌起作用。 预处理器不适用于代码中声明的类型(无论语言是什么)。

必须使用#define预处理程序指令声明对其他预处理器条件检查可见的标记。

 #define FOO #if FOO // this code will compile int x = 5; #else // this code won't int x = 10; #endif