问题描述
|
为什么以下代码无法按预期工作?
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