为什么下面的代码没有按预期工作?
void foobar(int);
#ifndef foobar
printf("foobar exists");
#endif
总是打印消息;它显然无法检测到一个函数作为一个实体的存在。 (这是一个过载的问题吗?)
为什么#ifdef
(或其变体)不能检测函数声明?声明应该在预处理时提供,所以它应该有效,不应该吗?如果没有,是否有替代方案或解决方法?
答案 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