- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
吴梅红
厦门大学计算机科学系
C语言程序设计
厦门大学本科生公共课
第7章 编译预处理
7.0 预处理命令
7.1 宏定义
7.2 条件编译(*)
7.3 文件包含
7.4 多文件组织
7.0 预处理命令
? 预处理命令:以”#”开头的命令;
? 预处理命令不是C语言的组成部分,但也是由ANSI C统一规定的,为
了区别于一般的C语句,规定预处理命令必须从新的一行开始,
以”#”开头,以回车符结束。
? 预处理命令不能被编译程序识别,必须在编译之前由专门的预处理程
序进行转换。
? 现在的C编译系统一般都包括预处理、编译和链接等部分,C编译系
统对C源程序的一般处理过程是:
– 首先,运行预处理程序扫描源代码,对源程序中的预处理命令进行转换
和处理;
– 然后,运行编译程序,把源程序编译成目标代码;
– 最后,运行链接程序,把目标代码链接成可执行文件。
? C语言提供了宏定义、文件包含、条件编译等多种预处理功能,有效
扩展了C语言程序设计的环境,减少程序设计和维护工作量,增强程
序可读性。
7.1 宏定义
? 7.1.1 不带参数的宏
? 7.1.2 带参数的宏
? 7.1.3 取消宏定义
宏提供了一种文本替换机制,C语言中用预处理命令#define定义宏。
宏定义有不带参数和带参数两类,不带参数的宏定义实现简单文本替
换,带参数的宏定义具有类似函数的功能。
7.1.1 不带参数的宏
? 定义形式:
#define 标识符 [字符序列]
例如:#define PI 3.14159
? 标识符就是宏的名字,字符序列可以为空,也可以是一串字符,用于
在预处理时替代宏名,称作替换文本;标识符与字符序列之间应当用
1个以上的空格或制表符隔开。
? 预处理时,预处理程序把源程序中出现在宏定义之后的所有宏名逐一
替换成相应的替换文本,这样的替换过程成为“宏扩展”或“宏替
换”。
例如:s=PI*r*r;
经过预处理被替换成:s=3.14159*r*r;
使用宏的好处:
? 提高程序的可读性,描述性的宏名有助于更好地理解对应的替换文本
的含义和用途;
? 可以减少程序中同一个常量的重复书写,并方便对该变量的修改。
7.1.1 不带参数的宏
注意:
(1)宏定义只能以“回车”结束,预处理程序将宏定义中从宏名之后的第一
个非空白字符开始到换行符之前的所有字符作为替换文本。
(2)如果宏定义超过一行,可以在该行行末加一个反斜杠”\”来续行。例如:
#define LONG_STRING this is\
not a very long string
(3)如果在字符常量、字符串和注释中出现宏名,则不做扩展。例如:
#define HI hello
语句printf(“HI”);输出的仍然是HI,而不是hello。
(4)允许嵌套使用宏,即一个宏名可以出现在另一个宏的替换文本中。例如:
#define X 5
#define Y X+1
#define Z Y*X
例子:a=Z;逐层替换:a=Y*X; →a=X+1*5; → a=5+1*5;
(5)尽管宏名也是一个标识符,但它不是变量,不分配内存空间,因此,不
能作为变量使用。
(6)宏定义中可以没有替换文本,例如:#define EMPTY
这种宏定义通常作为条件编译检测的一个标志。
7.1.2 带参数的宏
? 定义形式:
#define 标识符(参数表) [字符序列]
? 参数表是一系列由逗号分隔的标识符,这些标识符的作用与C语言函
数中形参类似;标识符与括号”(”之间不能有空格。
? 定义带参数的宏后,在后继的源程序中可以采用如下的类似函数调用
带参数的宏:
宏名(实参表)
例如:#define MULT(a,b) a*b
在后继程序中可以用下面语句调用该宏:
printf(“%d\n”,MULT(1+2,3+4));
? 宏替换分两步:
– 首先,用宏定义中的替换文本替换整个宏调用;
– 然后,将替换文本中出现的各个形参分别用宏调用中对应的实参
替换。
则上面的语句被替换为:
printf(“%d\n”,1+2*3+4);
7.1.2 带参数的宏
? (1)函数调用时,先对实参表达式求值,然后把实参的
值赋给形参;而调用带参数宏时,只是进行单纯的文本替
换。
例如: printf(“%d\n”,MULT(1+2,3+4));
为了保证宏扩展后表达式运算的正确性,有时需要对形式参数加括
号或对整个替换文本加括号。
例如:#define MULT(a,b) ((a)*(b))
? (2)函数调用时,要求实
您可能关注的文档
最近下载
- 莫扎特降B大调钢琴奏鸣曲(K333)第一乐章 钢琴谱五线谱.pdf VIP
- 小红书种草营销师(初级)认证考试真题试题库(含答案).docx VIP
- 2020年“5G+智慧医疗”行业解决方案ppt.pptx
- 建筑及居住区数字化技术应用第3部分:物业管理.pdf VIP
- 《快递实务》全套教案.docx VIP
- 职业技术学校护理实训基地建设方案.pdf VIP
- 2023中国新型储能行业发展白皮书.pdf VIP
- 2024中国新型储能行业发展白皮书-储能领跑者联盟.pdf VIP
- 储能领跑者联盟:2025中国新型储能行业发展白皮书机遇与挑战.pdf VIP
- 苏教版六年级数学上册全册教案(新教材).pdf VIP
文档评论(0)