- 1、本文档共129页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第11章 C语言预处理输入输出和文件操作
第11章 预处理、输入/输出和文件操作 C语言的预处理功能由C编译的预处理程序实现,负责分析和处理行首以“#”号开头的控制行。由于它们是在编译程序的第一遍扫描(即词法和语法分析)之前进行,所以这部分程序称为预处理程序。 C语言中并没有专门用于输入/输出的语句。为了给出方便的程序接口,C语言中提供了“标准I/O库”,它是一组函数,可提供一系列I/O服务。 11.1 预处理功能 11.1.1 宏定义和宏替换 1.简单宏定义和宏替换 简单宏定义的一般形式是: #define 标识符 字符序列 其中,标识符被称作宏名,一般用大写字母,以便阅读时容易与程序中的变量名或函数名相区别。 例如: #define PI 3.1415926 对于像PI这样的宏在进行使用和处理时分为三个步骤: ①在函数之外(往往在程序开头)使用#define控制行来定义宏名; ②在程序中使用已定义的宏名; ③在程序进行编译时,由预处理程序对宏名进行宏替换,恢复被宏名所代替的字符序列的原貌。例如: #define N 50 #define PI 3.1415926 int a[N] ; double r , l ; l = 2 * PI * r ; 经过宏替换之后,上述代码实际上就变成: int a[50]; double r,l; l = 2 * 3.1415926 * r ; 有关宏的定义和使用要注意以下几点。 (1)宏定义在源程序中要单独占用一行,通常“#”号出现在一行的第一个字符的位置,允许在#号的前面有若干空格或制表符,但不允许有其他字符。 (2)宏名用大、小写字母标识都行,为醒目起见,往往用大写字母表示。 (3)用双引号括起来的标识符不做宏替换。例如: #define TRUE 1 则打印语句 printf(TRUE); 会打印出TRUE,而不是1。 (4)宏定义可以嵌套。例如: #define PI 3.1415926 #define TWOPI ( 2*PI ) (5)宏替换只是按原来的定义“机械地”进行替换,不管替换后的结果是对还是错。例如: #define A 3+2 那么,5/A被替换成5/3+2, 又如: #define PI 3.l415q /* 有错: 4的前面是字母l , 5的后面是字母q */ 那么,area = PI * r * r;照样进行宏替换:area = 3.l415q * r * r; 为了避免出现上述第一种情况造成的误解,应当把字符序列用括号括起来,成为如下形式: #define A (3+2) (6)如果宏定义中的字符序列过长,在一行中放不下,可在该行末尾加续行符\,后随一个换行符,该字符序列的其余部分在下一行中出现。 (7)可以用宏定义来表示数据类型。 例如: #define MAX 100 #define ENTRY struct entrytype 在程序中可用ENTRY定义变量: ENTRY table[MAX] , * p; (8)如果宏名出现在#号之后,则不对它进行替换。例如: #define DEF define #DEF N 10 (9)宏名的有效范围是从定义它的地方开始到其所在文件末尾或者用 #undef指令消除该宏定义为止。宏名不受分程序结构的影响,在其有效范围内遵循宏替换的规则。 在标准C语言中还有另一种方法定义符号常量,即利用const关键字。const修饰符可以出现在任何变量定义的前面。例如: const int pagesize=66; const float pi=3.1415926; 2.带参数的宏定义和宏替换 带参数的宏定义的一般形式是: #define 宏名(参数表) 字符序列 例如,定义一个计算圆面积的宏: #define PI 3.1415926536 #define area(r) (PI * r * r) 在使用带参数的宏时应注意下面几点。 (1)调用宏时所带的实参可以是常量、已被赋值的变量名或者表达式。 例11-3 将例11-2的程序改写为交互式输入半径值的方式。 #define PI 3.1415926536 #define area(r) (PI*r*r) main( ) { float r; printf(Input:r=?\n); scanf(%f,r);
文档评论(0)