版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、新编c语言程序设计教程 清华大学出版社周二强 软件学院 计算机科学与工程系配套视频:配套视频: 博客:博客: 8章章 预处理预处理u8.1 8.1 程序编译程序编译u8.2 8.2 宏定义宏定义 8.2.1 简单宏 8.2.2 参数化宏u8.3 8.3 文件包含文件包含u8.4 8.4 条件编译条件编译8.1 8.1 程序编译程序编译u编译系统把一个编译系统把一个c c程序编译成可执行目标文件的过程可程序编译成可执行目标文件的过程可简单地分成两个阶段:编译汇编阶段和链接阶段。简单地分成两个阶段:编译汇编阶段和链接阶段。u一个一个c c语言程序可能包含多个源文件,在语言程序可能包含多个源文件,在
2、vc6.0vc6.0中用工程中用工程(projectproject)把多个相关的源文件组织在一起。)把多个相关的源文件组织在一起。编译汇编阶段u编译汇编阶段把源文件翻译成由相应的机器指令组成的编译汇编阶段把源文件翻译成由相应的机器指令组成的二进制文件。二进制文件。u在在vc6.0vc6.0中单击【组建(中单击【组建(buildbuild)】【编译()】【编译(compilecompile)】命令就可以把源文件编译汇编了。编译汇编时可以检)】命令就可以把源文件编译汇编了。编译汇编时可以检查出源文件中的语法错误。查出源文件中的语法错误。链接阶段u链接阶段把与链接阶段把与c c语言程序相关的二进制文
3、件合并为一个语言程序相关的二进制文件合并为一个可执行目标文件。在可执行目标文件。在vc6.0vc6.0中单击【组建(中单击【组建(buildbuild)】【)】【组建(组建(buildbuild)】命令就可以把程序链接为一个可执行文)】命令就可以把程序链接为一个可执行文件。件。u链接阶段的主要任务是处理具有全局作用域的标识符在链接阶段的主要任务是处理具有全局作用域的标识符在多个文件中的使用问题。多个文件中的使用问题。u当两个源文件中定义了相同的全局作用域标识符或一个当两个源文件中定义了相同的全局作用域标识符或一个源文件中引用了其它源文件中并没有定义的全局作用域标源文件中引用了其它源文件中并没有
4、定义的全局作用域标识符时,链接阶段就会出错。识符时,链接阶段就会出错。源文件的组成u源文件通常由命令如源文件通常由命令如includeinclude和和c c语言语句两部分组成。语言语句两部分组成。u在源文件被编译之前,源文件中的命令需要被称为在源文件被编译之前,源文件中的命令需要被称为“预处预处理器理器”的程序处理,因此源文件中的命令又称为的程序处理,因此源文件中的命令又称为“预处理命预处理命令令”。u预处理命令的主要作用是方便程序的编写。预处理命令的主要作用是方便程序的编写。u与与c c语言语句相比,它常以语言语句相比,它常以# #开头,也不以分号结束。经过开头,也不以分号结束。经过预处理
5、后的源文件就只有预处理后的源文件就只有c c语言语句了。语言语句了。预处理阶段uc c语言编译系统如语言编译系统如vc6.0vc6.0、tctc等都集成有预处理器,当程序等都集成有预处理器,当程序被编译时,预处理器首先被调用执行。因此,编译系统的编被编译时,预处理器首先被调用执行。因此,编译系统的编译过程又可细分为预处理阶段、编译汇编阶段和链接阶段。译过程又可细分为预处理阶段、编译汇编阶段和链接阶段。uc c语言提供的预处理命令主要有语言提供的预处理命令主要有3 3种:种:1.1.宏定义宏定义2.2.文件包含文件包含3.3.条件编译条件编译return8.2 8.2 宏定义宏定义uc c语言的
6、宏利用语言的宏利用definedefine命令定义,一般形式为:命令定义,一般形式为:#define #define 标识符标识符 值值u其中,标识符称为宏名,值称为宏体。宏定义后,源文其中,标识符称为宏名,值称为宏体。宏定义后,源文件中应该出现宏体的地方均可用宏名代替。件中应该出现宏体的地方均可用宏名代替。u预处理器在预处理时会把宏名用宏体替换,这个过程称预处理器在预处理时会把宏名用宏体替换,这个过程称为为“宏展开宏展开”。宏展开只是一种机械性的操作,类似于文。宏展开只是一种机械性的操作,类似于文本编辑中的查找替换。本编辑中的查找替换。( (见标识符才替换见标识符才替换) )u宏分为两类:简
7、单宏和参数化宏。宏分为两类:简单宏和参数化宏。8.2.1 8.2.1 简单宏简单宏u简单宏的使用可以方便程序的修改,也可让程序书写简简单宏的使用可以方便程序的修改,也可让程序书写简单单 。1. 源文件中以标识符形式出现的宏名才会被宏体替换 2. #define pi 3.1415926;中宏pi 的宏体为3.1415926;。而语句area = pi * r * r;会被预处器修改为 3. undef 命令可以取消一个宏定义,一般形式为:#undef 宏名4. 宏名也有作用域,在作用域内的宏名才会被替换。一个宏的作用域起自定义之后,终止于被取消定义的命令行或定义该宏的源文件结束处。宏展开u在进
8、行宏定义时,可以引用已定义的宏。预处理器在预在进行宏定义时,可以引用已定义的宏。预处理器在预处理时会对替换后的语句重新扫描,以便对其中的宏再次处理时会对替换后的语句重新扫描,以便对其中的宏再次展开。展开。return8.2.2 8.2.2 参数化宏参数化宏u参数化宏就是带参数的宏,可以实现复杂的替换,定义形参数化宏就是带参数的宏,可以实现复杂的替换,定义形式如下:式如下:u#define #define 标识符标识符( (参数列表参数列表) ) 值值u其中,左圆括号必须紧跟在宏名之后不能有空格,否则,其中,左圆括号必须紧跟在宏名之后不能有空格,否则,“( (参数列表参数列表) ) 值值”会被认
9、为是宏体,宏也就成了简单宏。会被认为是宏体,宏也就成了简单宏。参数列表与函数的类似,如可以有零个或多个参数,但宏的参数列表与函数的类似,如可以有零个或多个参数,但宏的参数没有类型说明。参数没有类型说明。 u参数化宏的使用方式类似函数调用,形式如下:参数化宏的使用方式类似函数调用,形式如下: 宏名宏名( (实参列表实参列表) )参数化宏的调用u在预处理时,参数化宏的调用会被宏体替换,并且宏体在预处理时,参数化宏的调用会被宏体替换,并且宏体中以标识符形式出现的形参会被相对应的实参代替,接着中以标识符形式出现的形参会被相对应的实参代替,接着,预处理器会继续扫描宏体以便进行必要的宏展开。,预处理器会继
10、续扫描宏体以便进行必要的宏展开。例8-4 参数化宏与函数returnmyabs(-3.5) = 0.0myabs(-3.5) = 0.0中的中的0.00.0是因为用格式字符是因为用格式字符f f输出整输出整型变量时类型不匹配所致,如改为型变量时类型不匹配所致,如改为printf(myabs(-printf(myabs(-3.5) = %dn, myabs(-3.5);3.5) = %dn, myabs(-3.5);,则输出为,则输出为 8.3 8.3 文件包含文件包含u文件包含命令文件包含命令includeinclude的作用是让预处理器以指定文件的内的作用是让预处理器以指定文件的内容取代该命
11、令行。文件包含命令的常见形式有两种:容取代该命令行。文件包含命令的常见形式有两种:u#include #include #include #include 文件名文件名 u文件包含命令同宏类似,也是简单的替换。文件包含中的文文件包含命令同宏类似,也是简单的替换。文件包含中的文件通常被称为头文件,扩展名为件通常被称为头文件,扩展名为.h.h。头文件的内容一般为宏定。头文件的内容一般为宏定义和全局变量及函数的声明。头文件中也可包含义和全局变量及函数的声明。头文件中也可包含includeinclude命令命令及其它的预处理命令。及其它的预处理命令。u当一个头文件被多次包含进源文件时,就有可能出现某个
12、标当一个头文件被多次包含进源文件时,就有可能出现某个标识符被多次定义的错误。识符被多次定义的错误。例8-5 头文件的多次包含 预处理器第一次处理后8_5.c的内容如下: 预处理器第二次处理后8_5.c的内容如下: return8.4 8.4 条件编译条件编译u条件编译命令使预处理器有选择的在源程序中保留或删除某条件编译命令使预处理器有选择的在源程序中保留或删除某程序段。使用条件编译命令的一般形式为:程序段。使用条件编译命令的一般形式为:u#ifndef #ifndef 宏名宏名 程序段程序段 #endif#endifu如果宏名在源文件中没有被定义,则预处理时程序段就会保如果宏名在源文件中没有被
13、定义,则预处理时程序段就会保留在源文件中;如果宏名已经有定义了,则程序段在预处理时留在源文件中;如果宏名已经有定义了,则程序段在预处理时会被删除。会被删除。u可以利用条件编译命令可以利用条件编译命令ifndefifndef和和endifendif解决头文件多次包含解决头文件多次包含引起的标识符被重复定义的问题。引起的标识符被重复定义的问题。修改例8-5中header1.h利用条件编译命令解决标识符被重复定义的问题definedu预处理命令中有一个内部函数预处理命令中有一个内部函数defineddefined,它需一个宏名,它需一个宏名作参数。若作为参数的宏名已经有定义,则作参数。若作为参数的宏
14、名已经有定义,则defineddefined函数函数返回返回1 1,否则它返回,否则它返回0 0。defineddefined也被看作是一个操作符,也被看作是一个操作符,因此,因此,“defined(defined(宏名宏名)”)”与与“defined defined 宏名宏名”等价。注等价。注意意defineddefined前面不带前面不带# #号。号。u“#ifndef #ifndef 宏名宏名”等价于等价于“# if !defined(# if !defined(宏名宏名)”)”,也就是说也就是说ifif是一个条件编译指令,它后面表达式中的操作是一个条件编译指令,它后面表达式中的操作数只能是整型字面量。如果表达式的值为真,则相关程序数只能是整型字面量。如果表达式的值为真,则相关程序段会被留在源程序中,否则相关程序段在预处理时会被删段会被留在源程序中,否则相关程序段在预处理时会被删除。除。“#ifdef #ifdef 宏名宏名”等价于等价于 “ “#if defined(#if defined(宏名宏名)”)”。其它的条件编译指令u条件编译指令还有条件编译指令还有elifelif(相当于(相当于else ifelse i
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 重庆市2025届高三第一次学业质量调研抽测化学试题 (含答案)
- 四川省泸州市江阳区泸州老窖天府中学2024-2025学年九年级上学期1月期末化学试卷(含答案)
- 湖北省部分市州2024-2025学年高二年级(上)期末质量监测数学试题(含答案)
- 安徽省阜阳市临泉第二中学2024-2025学年高三上学期12月月考政治试题(含答案)
- 语文-山东省潍坊市、临沂市2024-2025学年度2025届高三上学期期末质量检测试题和答案
- 2024建筑门窗幕墙专业分包合同模板
- 2024货物运输长期合同范本格式
- 2024酒店屋顶花园建设承包合同
- 2024适用型房产交易协议样本版B版
- 福建省南平市建阳县回龙中学2021-2022学年高三物理下学期期末试卷含解析
- DBJ∕T 15-120-2017 城市轨道交通既有结构保护技术规范
- CJJ181-2012 城镇排水管道检测与评估技术规程
- 生物医学电子学智慧树知到期末考试答案章节答案2024年天津大学
- 2023 版《中国近现代史纲要》 课后习题答案
- DB11T 489-2024 建筑基坑支护技术规程
- 一例火电机组有功功率突变原因分析及预防措施
- 数学寒假计划书
- 第五章 中国特色社会主义理论体系的形成发展(一)
- 低空经济公司设立可行性分析
- 2024新能源风电场集电线路施工方案
- 2023-2024学年江西省吉安市吉州区八年级(上)期末数学试卷(含解析)
评论
0/150
提交评论