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

Syn*_*ech 5 c declaration c-preprocessor

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

void foobar(int);

#ifndef foobar
  printf("foobar exists");
#endif
Run Code Online (Sandbox Code Playgroud)

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

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

dka*_*man 8

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

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

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

#define FOO

#ifdef FOO
 void foo(int);
#endif

#ifdef FOO
   printf("foo exists");
#endif
Run Code Online (Sandbox Code Playgroud)