当函数fun()定义在main()之上时,变量'a'不能通过预处理器宏解析,但在main()下定义时工作正常.
#include <stdio.h>
void fun()
{
printf("%d",a);
}
int main()
{
#define a 5
fun();
return 0 ;
}
Run Code Online (Sandbox Code Playgroud)
它背后的原因是什么?我们如何让它工作,这样我就不必移动函数fun()定义了.
C预处理器自上而下运行并替换#defines("文本替换").所以,当#define a 5在main(),就不能"回头"和替换a的func(); 它只能取代a低于它的's,如果有的话#define.
你只需要在上面定义它func().
表单的预处理指令
Run Code Online (Sandbox Code Playgroud)# define identifier replacement-list new-line定义一个类似对象的宏,它使宏名称 171)的每个后续实例被构成指令其余部分的预处理标记的替换列表替换.然后重新扫描替换列表以获取更多宏名称,如下所示.
从标准C开始就是这样.来自Dennis Ritchie的C参考手册:
12.1令牌替换表单的编译器控制行
#define identifier token-string
(注意:没有尾随分号)导致预处理器用给定的标记字符串替换标识符的后续实例 (编译器控制行除外).替换标记字符串已从中删除注释,并且它被空白包围.不尝试重新扫描替换字符串.
(强调我的).
| 归档时间: |
|
| 查看次数: |
589 次 |
| 最近记录: |