0
点赞
收藏
分享

微信扫一扫

【哈工大计算机系统大作业】第2章 预处理

杰森wang 2022-04-23 阅读 117
windows

文章目录

2.1 预处理的概念与作用

2.1.1 预处理的概念

预处理指的是程序在编译之前进行的处理,是计算机在处理一个程序时所进行的第一步处理,可以进行代码文本的替换工作,但是不做语法检查。预处理是为编译做的准备工作,能够对源程序 . c .c .c文件中出现的以字符“#”开头的命令进行处理,包括宏定义# d e f i n e define define、文件包含# i n c l u d e include include、条件编译# i f d e f ifdef ifdef等,最后将修改之后的文本进行保存,生成 . i .i .i文件,预处理结束。而在 H e l l o Hello Hello中会进行的处理如图所示:
图2.1 hello.c中有关预处理的命令

2.1.2 预处理的作用

在预处理的过程中,计算机利用预处理器( c p p cpp cpp)进行处理。而预处理主要有 3 3 3个方面的内容,分别是根据字符“#”后所跟的具体语句进行不同处理。它们分别为宏定义、文件包含、条件编译。
宏定义在预处理的过程中会进行宏替换。在具体语句中表现为# d e f i n e define define。宏定义具体而言又分为两种,在不带参数的宏定义中,要用实际值替换用# d e f i n e define define定义的字符或字符串;而在带参数的宏定义中,不仅仅要进行实际值的替换,还要将参数进行代换。在宏替换中,仅仅只是做替换,不做计算和表达式求值。
文件包含指的是对代码中出现的# i n c l u d e include include语句进行处理。# i n c l u d e include include指令能够告诉预处理器读取源程序中所引用的系统的源文件,并且将这一段代码直接插入到程序文件中,最终保存为 . i .i .i文件中。而在 H e l l o Hello Hello实例中,预处理会对# i n c l u d e include include< s t d i o . h stdio.h stdio.h>、# i n c l u d e include include< u n i s t d . h unistd.h unistd.h>、# i n c l u d e include include< s t d l i b . h stdlib.h stdlib.h>三条语句进行文件包含的处理。
条件编译指的是针对# i f d e f ifdef ifdef、# i f n d e f ifndef ifndef等语句进行的处理。条件编译能够根据# i f if if的不同条件决定需要进行编译的代码,# e n d i f endif endif是结束这些语句的标志。使用条件编译可以使目标程序变小,在满足条件之后才会进行编译。

2.2 在Ubuntu下预处理的命令

下面在 L i n u x Linux Linux下对 H e l l o Hello Hello进行预处理,过程如下:
具体指令为 l i n u x linux linux> c p p cpp cpp h e l l o . c hello.c hello.c > h e l l o . i hello.i hello.i
具体指令的截图如下:
图2.2 对hello.c进行预处理的指令生成hello.i
图2.3 hello.i与hello.c的信息比较
由图可知,在预处理器对程序进行预处理的过程中,对原来的 C C C代码进行了很大的修改以及补充,两个文本的大小相差极大,在main函数前被插入了大量的代码,这些都是进行预处理的结果。

2.3 Hello的预处理结果解析

在利用 L i n u x Linux Linux下的指令对 h e l l o . c hello.c hello.c进行预处理之后,生成的预处理文件保存在 h e l l o . i hello.i hello.i文件中,在 L i n u x Linux Linux下对其进行打开,使用 g e d i t gedit gedit工具,打开如下:
图2.4 hello.i的部分文本

在打开的文本中,我们很容易看到 h e l l o . i hello.i hello.i中添加了很多代码,而原来的 C C C代码在文本的最末端,如图:
图2.5 原来的hello.c代码

由于预处理只是对源代码中的以字符“#”开头的语句进行处理,因此在预处理阶段程序中定义的其他操作并不会在预处理阶段进行处理。由于在程序中有关于头文件的文件包含,因此在预处理时对这一段进行了解析。在 m a i n main main函数之前,预处理器就分别读取 s t d i o . h stdio.h stdio.h u n i s t d . h unistd.h unistd.h s t d l i b . h stdlib.h stdlib.h中的内容,并且根据读入的顺序依次进行内容的展开。如果头文件中仍然有以字符“#”开头的内容,则预处理器继续对其进行处理,最终的 h e l l o . i hello.i hello.i文件中没有宏定义、文件包含及条件解析等内容。而在 h e l l o . i hello.i hello.i文件中我们还能看到在源程序中定义的命令行参数、环境变量的内容,以及在文件包含中对头文件的处理,使用存储的绝对路径进行显示。另外,还有在头文件中使用的一些数据类型的说明、结构体定义、对引用的外部函数的声明,再包括未进行大修改的源代码,一起构成了 h e l l o . i hello.i hello.i头文件。上述信息如图所示:
图2.6 hello.i中的部分外部引用

2.4 本章小结

在本章中,通过对预处理的概念与作用的了解,结合具体的 h e l l o hello hello程序,对与处理中所做的处理进行了进一步分析,对预处理的指令进行了运用。同时针对预处理的操作结合 h e l l o . c hello.c hello.c进行了具体的阐述,对 h e l l o hello hello的预处理结果 h e l l o . i hello.i hello.i进行了结果解析。

举报

相关推荐

0 条评论