当函数fun()定义在main()之上时,预处理器宏无法解析变量“a”,但当函数fun()定义在main()之下时,变量“a”可以正常工作。

#include <stdio.h>

void fun()
{
    printf("%d",a);
}

int main()
{
    #define a 5
    fun();
    return 0 ;
}

背后的原因是什么我们如何才能使它工作,这样我就不必移动fun()函数的定义。

最佳答案

C预处理器自上而下运行并替换#defines(“文本替换”)。因此,当#define a 5中的main()时,它不能“返回”并替换a中的func();它只能替换其a下的#define
你只需要在func()上面定义它。
C11 draft, 6.10.3 Macro replacement
表单的预处理指令

# define identifier replacement-list new-line

定义一个类似于对象的宏,该宏导致
宏名171)替换为
构成
指令然后重新扫描替换列表以获取更多宏名称
如下所述。
这与标准前的C.FromDennis Ritchie's C Reference Manual相同:
12.1令牌替换表的编译器控制行
#定义标识符标记字符串
(注意:没有尾随分号)导致预处理器替换
具有给定标记字符串的标识符的后续实例
(编译器控制行内除外)。替换令牌字符串
从中删除了评论,并用空格包围。不
尝试重新扫描替换字符串。
(强调我的)。

关于c - 在函数内部使用时发生变量未声明的错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41634240/

10-11 22:53
查看更多