编译预处理

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

编译预处理
1概述:
编译预处理是在源程序正式编译前的处理。

预处理名令一般写在程序的最开头,并且以#开头的命令。

编译预处理命令不是c语言本身的组成部分,也不属于c语句,不能直接对他们编译。

在代码的正式编译之前(编译即指转换成二进制的机器语言),系统先对预处理命令进行处理,然后再由编译程序对处理后的程序进行正常的编译,得到可执行文件。

即对一个源程序进行编译时,系统会先引用预处理命令对源程序中的预处理部分进行处理,然后自动进行源程序的编译。

C语言提供3中预处理命令:宏替换文件包含条件编译他们均以#开头,并独占一个书写行,语句结尾不用;作为结束符。

2 宏替换(宏定义)
分为两种:
(1)无参数的宏替换
是指用一个指定的标识符(即宏名)来代表程序中的一个字符串。

格式#define 宏名字符串
如#define SIZE 10
SIZE为宏名,此命令执行后,预处理程序对源程序中的所有SIZE的标识符用10替换。

说明:
①宏名一般用大写字符,但不是必须的。

②字符串可以是常量,表达式,语句或多条语句可以是任何语句如输出语句,赋值语句等等
③宏定义与变量定义不同,只是做字符的简单替换,不占内存空间,也不赋值
④结尾不能加;,如果加了;,则;也作为字符串的一部分,一同参与替换。

⑤宏定义允许嵌套定义,即在宏定义的字符串中可以使用已经定义的宏名。

⑥宏定义要写在函数之外的,一般写在程序的开头,作用范围是从定义到本文件结束,出来这个文件失去作用了。

若要终止其作用,在需要终止前面加#undef 宏名
⑦若宏名出现在双引号中,则将不会发生宏替换。

如printf(“ADD”) ADD是宏,这里不会进行宏替换了
⑧替换文本不替换用户标识符中的成分宏名ADD不会替换标识符ADDIP中的ADD
(2)有参数的宏替换
宏定义中的参数为形式参数,在宏调用中的参数为实际参数。

格式:#define 宏名(形参)字符串
各参数间用,隔开。

替换时,不仅要将宏展开,还要将形参替换为实参,但是仅仅是替换而不会去运算得出一个值,这点千万注意。

说明:①注意参数有括号与无括号的区别,这里只是进行直接的替换,不进行其他任何操作。

②宏替换之后为一个字符串,不是一个值。

③在带参的宏定义中宏名与(形参)之间不能有空格,否则则被认为是无参宏定义,会将空格后面的字符都当做替换字符串的一部分。

如:
#define Y (x) x*x
K=Y(5);
宏替换为
K=(x) x*x(5)
④这里虽然哟形参与实参但是,与函数调用时不同,这里只是简单的替换,不存在数值传递。

形参不占内存,不必进行类型说明。

但实参的值是要进行类型说明的。

⑤带参宏与带参函数区别:
带参宏不存在数值传递,不占运行时间,占用编译预处理时间。

而函数的调用占运行时间,且时间比宏长。

由于宏替换是原样替换,所以宏展开后,源程序会增长,但函数调用则不会。

此外,有返回值函数会返回一个数值,无返回值函数进行其他操作。

而宏替换只进行替换,不进行计算,赋值等其他任何操作。

⑥仍用#undef 宏名(形参)终止。

3 文件包含
文件包含是指一个源程序文件将另一个指定文件的全部内容包含进来,即将一个文件包含到另一个文件中去,形成一个文件。

一般放在C程序的前面。

格式为
#include<文件名>或者#include”文件名”
说明:
①文件名是指在磁盘中的文本文件名字且包含扩展名。

扩展名后缀是自己制定的。

②在预编译过程中,预编译程序将用包含的文件中的内容替换此命令行。

③由于文件一般写在开头,也叫头文件
④一个包含命令只能包含指定的一个文件,若有多个文件需要包含时,则要引用多个包含命令。

⑤包含文件可以嵌套,即包含文件中还可以包含其他文件。

⑥包含文件中一般包含一些公用的#define命令行,定义的函数等
⑦在程序开发时,可以把一些宏定义,一些自定义函数分别存入不同的文件中,当需要使用某类宏定义或某函数时,就该函数或宏定义所在的文件包含到程序的开头。

⑧文件包含是很有用的,一个大的程序可以分为多个模块,单独编写成多个文件,再由包含命令合之为一个文件。

相关文档
最新文档