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

时间:2011-06-04 04:46:43

标签: c c-preprocessor declaration

为什么下面的代码没有按预期工作?

void foobar(int);

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

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

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

2 个答案:

答案 0 :(得分:8)

  

声明应该在   预处理,所以它应该工作,   不应该吗?

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

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

#define FOO

#ifdef FOO
 void foo(int);
#endif

#ifdef FOO
   printf("foo exists");
#endif

答案 1 :(得分:0)

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

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

#define FOO

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