#define的范围在单个主文件中

时间:2012-03-31 16:53:09

标签: c scope macros c-preprocessor

我知道可能没有宏的范围概念,但请帮助我理解以下输出 - 这似乎表明宏是函数的本地:

#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虽然据我说它应该是编译器错误。请解释原因?

5 个答案:

答案 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正是您所期望的。

请注意,所有预处理器指令都已消失,并且Adefine之间undef的所有实例都已替换为100

要记住的是:

  • 预处理器运行,更改文本
  • 然后编译器在结果
  • 上运行

答案 1 :(得分:1)

预编译器在编译时通过程序文本进行一次传递。到程序运行时,所有的指令早已不复存在。

最初,预处理器实际上是一个单独的程序,只有在以相同的方式解析令牌的情况下才能理解C.在将程序的宏扩展版本创建为临时文件之后,运行了真正的编译器。今天,它已集成到编译器中,但效果是相同的。

这就是使用全大写宏名称的惯例的开始,即为了强调它们本质上不同的性质。您仍然可以让编译器输出扩展但未编译的中间文本。这在跟踪错误和理解复杂的条件编译时偶尔会有用。

答案 2 :(得分:1)

您无法在函数中运行预处理程序命令。它们已从已编译的代码中删除。这就是为什么它们被称为预处理器:它们在程序编译之前被执行和删除。在fun()中,你没有定义数字100。

答案 3 :(得分:0)

宏在编译时执行(实际上在编译器之前)。

答案 4 :(得分:0)

宏扩展在预处理步骤完成,这是编译之前的一个步骤。 如果您希望在此步骤之后查看代码的外观,请尝试使用仅预处理选项进行编译。

e.g。

gcc -E myfile.c > myfile.ppout

并阅读输出。