我知道可能没有宏的范围概念,但请帮助我理解以下输出 - 这似乎表明宏是函数的本地:
#include<stdio.h>
#include<stdlib.h>
#define A 100
void fun();
int main()
{
fun();
printf("%d\n",A);
system("pause");
return 0;
}
void fun()
{
#undef A
}
程序的输出是100虽然据我说它应该是编译器错误。请解释原因?
答案 0 :(得分:2)
预处理器处理源代码的文本,并且在编译器正常运行之前执行 。
本质上,您的编译器适用于看起来像
的文件/* Lots of code from the included files omitted */
void fun();
int main()
{
fun();
printf("%d\n",100);
system("pause");
return 0;
}
void fun()
{
}
因此,运行和打印100正是您所期望的。
请注意,所有预处理器指令都已消失,并且A
和define
之间undef
的所有实例都已替换为100
。
要记住的是:
答案 1 :(得分:1)
预编译器在编译时通过程序文本进行一次传递。到程序运行时,所有的指令早已不复存在。
最初,预处理器实际上是一个单独的程序,只有在以相同的方式解析令牌的情况下才能理解C.在将程序的宏扩展版本创建为临时文件之后,运行了真正的编译器。今天,它已集成到编译器中,但效果是相同的。
这就是使用全大写宏名称的惯例的开始,即为了强调它们本质上不同的性质。您仍然可以让编译器输出扩展但未编译的中间文本。这在跟踪错误和理解复杂的条件编译时偶尔会有用。
答案 2 :(得分:1)
您无法在函数中运行预处理程序命令。它们已从已编译的代码中删除。这就是为什么它们被称为预处理器:它们在程序编译之前被执行和删除。在fun()中,你没有定义数字100。
答案 3 :(得分:0)
宏在编译时执行(实际上在编译器之前)。
答案 4 :(得分:0)
宏扩展在预处理步骤完成,这是编译之前的一个步骤。 如果您希望在此步骤之后查看代码的外观,请尝试使用仅预处理选项进行编译。
e.g。
gcc -E myfile.c > myfile.ppout
并阅读输出。