- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第12章_编译预处理解读
第十二章 编译预处理 12.1“文件包含”处理 12.2 宏定义 12.3 条件编译 基本概念 C提供的预处理功能主要有以下三种: 1.文件包含 2.宏定义 3.条件编译 这些功能分别用宏定义命令、文件包含命令、条件编译命令来实现。为了与一般C语句相区别,这些命令以符号“#”开头。例如: #define #include 12.2 宏定义 12.2.1 不带参数的宏定义 宏定义一般形式为: #include stdio.h #define PI 3.1415926 void main() { float l,s,r,v; printf(“input radius : ”); scanf(“%f”,r); l=2.0*PI*r; s=PI * r * r; v=3.0/4 * PI * r * r * r ; printf(“l=%10.4f\ns=%10.4f\nv=%10.4f\n”,l,s,v); return; } ANSI C标准规定可以在C源程序中加入一些“预处理命令” ,以改进程序设计环境,提高编程效率。 这些预处理命令是由ANSI C统一规定的,但是它不是C语言本身的组成部分,不能直接对它们进行编译(因为编译程序不能识别它们)。必须在对程序进行通常的编译之前,先对程序中这些特殊的命令进行“预处理”。 经过预处理后程序可由编译程序对预处理后的源程序进行通常的编译处理,得到可供执行的目标代码。 所谓“文件包含”处理是指一个源文件可以将另外一个源文件的全部内容包含进来。C语言提供了#include命令用来实现“文件包含”的操作。 其一般形式为: #include 文件名 或 #include 文件名 12.1 “文件包含”处理 注意: 在编译时并不是分别对主文件和被包含头文件分别进行编译,然后再将它们的目标程序连接的,而是在经过编译预处理后将头文件包含到主文件中,得到一个新的源程序,然后对该文件进行编译,得到一个目标(.obj)文件。被包含的文件成为新的源文件的一部分,而单独生成目标文件。 (1) 一个#include命令只能指定一个被包含文件,如果要包含n个文件,要用n个#include命令。 (2) 如果文件1包含文件2,而在文件2中要用到文件3的内容,则可在文件1中用两个include命令分别包含文件2和文件3,而且文件3应出现在文件2之前,即在file1.c中定义。 (3) 在一个被包含文件中又可以包含另一个被包含文件,即文件包含是可以嵌套的。 说明: (4) 在#include命令中,文件名可以用双撇号或尖括号括起来。二者的区别是用尖括弧时,系统将在存放C库函数头文件所存的目录中寻找要包含的文件,这称为标准方式。用双引号时,系统先在用户当前目录中寻找要包含的文件,若找不到,再按标准方式查找(即再按尖括号的方式查找)。一般说,如果为调用库函数而用# include命令来包含相关的头文件,则用尖括号,以节省查找时间。如果要包含的是用户自己编写的文件(这种文件一般都在当前目录中),一般用双引号。 说明: (5) 被包含文件(file2.h)与其所在的文件(即用#include命令的源文件file2.c),在预编译后已成为同一个文件(而不是两个文件)。因此,如果file2.h中有全局静态变量,它也在file1.h文件中有效,不必用extern声明。 说明: #define 标识符 字符串 例如:# define PI 3.1415926 宏定义的作用是在本程序文件中用指定的标识符PI来代替“3.1415926”这个字符串,在编译预处理时,将程序中在该命令以后出现的所有的PI都用“3.1415926”代替。这种方法使用户能以一个简单的名字代替一个长的字符串。 这个标识符(名字)称为“宏名”。 在预编译时将宏名替换成字符串的过程称为“宏展开”。#define是宏定义命令。 例12.1 使用不带参数的宏定义。 input radius: 4↙ 运行情况如下: 1=25.1328 s=50.2655 v=150.7966 (1) 宏名一般习惯用大写字母表示,以便与变量名相区别。但这并非规定,也可用小写字母。 (2) 使用宏名代替一个字符串,可以减少程序中重复书写某些字符串的工作量。 (3) 宏定义是用宏名代替一个字符串,只作简单置换,不作正确性检查。只有在编译已被宏展开后的源程序时才会发现语法错误并报错。 说明: (4) 宏定义不是C语句,不必在行末加分号。如果加了分号则会连分号一起进行置换。 (5) #define命令出现在程序中函数的外面,宏名的有效范围为定义命令之后到本源文件结束。通常,#define命令写在文件开头,函
文档评论(0)