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