




已阅读5页,还剩18页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第13章 编译预处理和动态 存储分配,高级语言的源程序,编译、连接,目标代码。,编译预处理,上机过程:,13.1 编译预处理 在C编译程序对源程序进行编译前,由编译预处理程序对预处理命令行( 以#号开始的预处理命令行 )进行处理, 然后对预处理后的源程序进行编译、连接,产生可执行的目标代码。,C主要提供三种预处理命令: 宏定义、文件包含和 条件编译。本章重点介绍前两种。 1. 宏定义(宏替换) 有两种:不带参数宏定义和带参数宏定义。 (1) 不带参数宏定义形式 define 宏名 替换文本 其中:宏名 是用户定义的标识符。 替换文本 是字符串。 作用:编译预处理程序对源程序中所有表示宏名的标 识符用字符串来替换。 例如:#define N 100 编译预处理程序对源程序中所有N用100替换。,例:使用不带参数的宏定义。 #define N 10 void main() int aN,i; for(i=0;iN;i+)ai=i*i; for(i=0;iN;i+)printf(“%d “,ai); printf(“n”); 说明: 1)表示宏名的标识符习惯用大写字母表示,以便与变 量名区别,这并非规定。 2)宏定义的位置一般写在程序的开头。,3)替换文本中可包含已定义过的宏名。 例: #define PI 3.14159 #define N 100 #define M N*PI 最后一个宏定义,编译预处理程序对源程序中所有M用100*3.14159替换。 4)宏定义行的最后一个字符是”,表示下一行内容 是本行的续行。 例: #define LEAP_YEAR year % 4 = 0 ,例:不带参数的宏定义。 #define PR printf(“n”) void main ( ) int i ,j ,k; i=15; j=9; printf(“%d %d”, i+j, i-j); PR; /* 展开:printf(“n”) */ printf(“%d %d”, i*j, i/j); PR; /* 展开:printf(“n”) */ ,(2) 带参数的宏定义形式 #define 宏名(形参表) 替换文本 其中:宏名 是用户定义的标识符。 形参表 指定的形参(由标识符命名),形参之 间用逗号分开。 替换文本 是字符串(通常包含指定的形参)。 作用:编译预处理程序对源程序中出现的带实参的宏 ,用实参对#define命令行中的替换文本(字符 串)中形参进行替换。 例如:#define F(x,y) x*x+y*y int d1; d1=F(3,2)+10; /* d1=3*3+2*2+10; */ 把实参3和2代替宏定义中形参x和y,即F(3,2)表示3*3+2*2 。,例:带参数的宏定义。 #define M(x,y) xy?x:y void main ( ) int i ,j ,k; i=5; j=10; k=10*M(i, j); /* 展开:k=10*510?5:10; */ printf (“%dn”,k) 说明: 1)调用带参数的宏时,实参与形参的个数应相同。 2)实参可以是常量、变量或表达式形式。 3)带参数宏替换与函数调用有类似之处,但前者对参,数没有类型的要求。 4)宏替换中,实参不能替换双引号中的形参。 5)与不带参数的宏定义一样,同一个宏名不能重复定 义。 (3) 终止宏定义形式 #undef 已定义宏名 例如: #define PI 3.14159 main( ) #undef PI 从终止宏定义(#undef PI)后PI无定义,不代表3.14159了。,使用宏定义的优势: 1) 宏替换不占程序运行时间,只占编译时间。 2) 便于阅读 3) 修改方便 注意: 宏定义最后没有“ ;” 。,2. 文件包含 就是在一个文件中,将已有的另外一个文件的全部内容包含进来。 由于C的库函数很多,将这些函数根据类型不同分类, 分别放在不同的文件中(例如, 数学函数:math.h 、输入/出: stdio.h 、 字符函数: ctype.h 、字符串:string.h 、动态分配:malloc.h 其它:tdlib.h 。),编程时,使用哪个文件中的函数, 将该文件用文件包含的形式,写在程序的前面 。 C语言提供了#include 命令行, 实现“文件包含”功 能,其一般形式为: #include “文件名” 或 #include ,编译预程序将用指定的文件中的内容替换此命令行。 如果文件名用双引号括起来时,系统先在用户当前 目录查找要包含的文件,若找不到,再按标准方式(系 统指定的目录)查找;如果文件名用尖括号括起来时, 按标准方式查找。 说明: 1) #include 命令行的位置一般写在源程序的开头,文 件名后缀不一定是“.h”。 2) 包含文件(头文件)中,可包含一些 #define 命令行、 外部说明或对库函数的原形说明。 例: 将格式宏做成头文件format.h 。 头文件format.h内容如下:,#define PR printf #define NL “n” #define D “%dn” #define S “%s” 主文件 file1.c 内容如下: #include #include void main ( ) int a=2 ,b=4; char st =“CHINA”; PR(D,a); /* 展开:printf(“%dn”,a) */ PR(D,b); /* 展开:printf(“%dn”,b) */ PR(S,st); /* 展开:printf(“%s”,st) */ PR(NL); /* 展开:printf(“n”) */ ,3)当包含文件(头文件)修改后,对包含头文件的源程序 必须重进行编译连接。 4)在一个程序中允许有多个#include 命令行。 5)在包含文件(头文件)中还可以其他文件。 例:在包含文件(头文件) file2.h中包含文件file3.h 。 见下面图示: file1.c file2.h file3.h,例:文件包含的程序。 #include #include #include void main() float x,y; char s1 =”book”,s220; x=1.5; y=sqrt(12*a)+sin(a*3.1416/180); strcpy(s2,s1); printf(“%fn”,y); printf(“%sn”,s2); ,说明: 包含文件也可以是自己 编的一些函数,放在一个文件中,使用时只要在程序前部包含进去,文件中的函数可以在程序中调用,节省程序开发时间。,3. 条件编译 有条件的对源程序的某部分进行编译,减少目标代码的存储空间。有三种形式: 形式1: #ifdef 标识符 程序段1 #else 程序段2 #endif 标识符 #define 定义过,则程序段1被编译,否则 ,程序段2被编译。,可选,形式2: #ifndf 标识符 程序段1 #else 程序段2 #endif 标识符没用#define 定义过,则程序段1被编译, 否则,程序段2被编译。,形式3: #if 表达式 程序段1 #else 程序段2 #endif 表达式为非0,则程序段1被编译,否则,程序段2被编译。,13.2 动态存储分配 在程序执行期间根据需要可动态分配存储空间,不用时可释放。C语言提供的四个标准函数:malloc 、 calloc 、free 和 realloc 可实现前述功能。 1. malloc函数和free函数 (1) malloc函数调用形式 malloc(size); 其中: size 它的类型为unsinged int 。 功能:分配size个字节存储间。返回指向存储空间首地 址的基类型为void的地址。若分配的存储空间不 足,函数返回空(NULL)。,(2) free函数调用形式 free(P); 其中: P 类型为指针变量,指向动态分配的地址。 功能:将指针P所指的存储空间释放。(无函数返回值) 例: 函数malloc和free的使用。 short int *pi; float *pf; pi=(short *)malloc(2); /*pi指向short int 2个字节地址*/ pf=(float *)malloc(4); /*pf指向float 4个字节地址*/ free(Pi); /* 释放指针Pi所指的存储空间 */ free(Pf); /* 释放指针Pf所指的存储空间 */,在申请动态存储空间时,若不能确定数据类型所占字节数,可以使用sizeof运算符来求得。 例如: short int *pi; float *pf; pi=(int *)malloc( sizeof(int) ); pf=(float *)malloc( sizeof(float) ); 这是一种常用的形式。,2. calloc函数 调用形式: calloc(n,size); 其中: n,size 类型均为unsin
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 公司纸壳回收管理制度
- 公司质量检查管理制度
- 防雷接地安全技术交底
- 广东省广州市2024~2025学年 高三下册3月检测数学试卷附解析
- 高温热能系统智能化运行与故障预警-洞察阐释
- 监理邀请招标回复函
- 宁夏回族自治区西北生物科技有限公司招聘笔试真题2024
- 中国美术学院非教学岗位招聘笔试真题2024
- 数字技术推动乡村绿色生态农业发展
- 印刷业企业经营管理方案
- 中医专科护士进修汇报
- 绩效管理手册(知名电器公司)
- 基于分布式光纤传感的交通振动信号识别算法研究
- 形势与政策(2025春)超星尔雅学习通答案满分章节测试
- 全断面岩石掘进机刀盘振动理论及应用
- 工业机器人安全培训
- 人力资源开发与管理模拟试题及答案
- 辽宁省沈阳市皇姑区2023年小升初语文试卷(学生版+解析)
- 围手术期的ERAS营养护理管理
- 急性肾功能不全护理查房
- 2025年上海市普陀区招聘161名社区工作者历年高频重点提升(共500题)附带答案详解
评论
0/150
提交评论