编译C程序–幕后花絮
预处理器是系统软件(旨在在计算机的硬件和应用程序上运行的计算机程序)。它执行高级语言(HLL)的预处理。预处理是语言处理系统的第一步。语言处理系统将高级语言转换为机器级语言或绝对机器代码(即,转换为机器可以理解的形式)。
- 预处理程序不了解C的作用域规则。#define之类的预处理程序指令一经看到便立即生效,并一直有效直到包含它们的文件的末尾。程序的块结构无关紧要。
预处理器主要对HLL代码执行三个任务:
- 删除评论:删除所有评论。注释仅供人类理解代码。因此,很明显,它们对机器没有用。因此,预处理器会删除所有它们,因为它们在执行中不是必需的,也不会被执行。
这是在Linux中如何查看带有删除注释的文件):
编写一个C代码(让文件名为prog.c )。使用命令gcc -E prog.c对其进行预处理
您将看到输出,其中的代码没有注释。
该文件以’.i’扩展名(prog.i)保存,该扩展名将输入到编译器中。 - 文件包含:包含我们程序需要的库中的所有文件。在HLL中,我们编写#include ,这是预处理器的指令,告诉它包括指定的库文件的内容。例如,#include
将告诉预处理器将所有内容包括在库文件stdio.h中。
也可以使用双引号-#include“ stdio.h”
注意:如果文件名括在尖括号内,则在标准编译器包含路径中搜索文件。如果文件名用双引号引起来,则搜索路径将扩展为包括当前源目录。- 宏扩展:可以将宏称为小的函数,而不需要处理这些开销。如果我们必须编写一个函数(具有一个小定义),需要递归地(一次又一次地)调用它,那么相对于函数,我们应该更喜欢使用宏。
因此,定义这些宏是由预处理器完成的。#define SI 1000
是宏的简单示例。
- 宏有两种类型:类对象(不带参数)和类函数(可以带参数)
// object-like macro #define // function-like macro #define ()
- 您可以使用#undef删除宏定义:
// delete the macro # undef We can write multi-line macro same like function, but each statement ends with “\”. #include
#define MACRO(num, str) {\ printf("%d", num);\ printf(" is");\ printf(" %s number", str);\ printf("\n");\ }
- 宏扩展:可以将宏称为小的函数,而不需要处理这些开销。如果我们必须编写一个函数(具有一个小定义),需要递归地(一次又一次地)调用它,那么相对于函数,我们应该更喜欢使用宏。
想要从精选的最佳视频中学习和练习问题,请查看《基础知识到高级C的C基础课程》。 - 删除评论:删除所有评论。注释仅供人类理解代码。因此,很明显,它们对机器没有用。因此,预处理器会删除所有它们,因为它们在执行中不是必需的,也不会被执行。