在函数内部使用时可变未声明的错误

ang*_*mit 1 c macros

当函数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()定义了.

usr*_*usr 5

C预处理器自上而下运行并替换#defines("文本替换").所以,当#define a 5main(),就不能"回头"和替换afunc(); 它只能取代a低于它的's,如果有的话#define.

你只需要在上面定义它func().

C11草案,6.10.3宏替换:

表单的预处理指令

# define identifier replacement-list new-line
Run Code Online (Sandbox Code Playgroud)

定义一个类似对象的宏,它使宏名称 171)的每个后续实例被构成指令其余部分的预处理标记的替换列表替换.然后重新扫描替换列表以获取更多宏名称,如下所示.

从标准C开始就是这样.来自Dennis Ritchie的C参考手册:

12.1令牌替换表单的编译器控制行

#define identifier token-string

(注意:没有尾随分号)导致预处理器用给定的标记字符串替换标识符的后续实例 (编译器控制行除外).替换标记字符串已从中删除注释,并且它被空白包围.不尝试重新扫描替换字符串.

(强调我的).