第13章预处理和动态存储分配_第1页
第13章预处理和动态存储分配_第2页
第13章预处理和动态存储分配_第3页
第13章预处理和动态存储分配_第4页
第13章预处理和动态存储分配_第5页
已阅读5页,还剩18页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、 第第1313章章 编译预处理和动态编译预处理和动态 存储分配存储分配 高级语言高级语言的源程序的源程序 编译、编译、连接连接 目标代码。目标代码。 编译预处理编译预处理 上机过程:上机过程:13.1 编译预处理编译预处理 在在c编译程序对源程序进行编译前,由编译预处理编译程序对源程序进行编译前,由编译预处理程序对预处理命令行程序对预处理命令行( 以以#号开始的预处理命令行号开始的预处理命令行 )进行进行处理处理, 然后对预处理后的源程序进行编译、连接,产生然后对预处理后的源程序进行编译、连接,产生可执行的目标代码。可执行的目标代码。 c主要提供三种预处理命令主要提供三种预处理命令: 宏定义、

2、文件包含宏定义、文件包含和和条件编译。本章重点介绍前两种。条件编译。本章重点介绍前两种。1. 宏定义宏定义(宏替换宏替换) 有两种:不带参数宏定义和带参数宏定义。有两种:不带参数宏定义和带参数宏定义。 (1) 不带参数宏定义形式不带参数宏定义形式 define 宏名宏名 替换文本替换文本其中:其中:宏名宏名 是用户定义的标识符。是用户定义的标识符。 替换文本替换文本 是字符串。是字符串。作用:编译预处理程序对源程序中所有表示宏名的标作用:编译预处理程序对源程序中所有表示宏名的标 识符用字符串来替换。识符用字符串来替换。例如:例如:#define n 100编译预处理程序对源程序中所有编译预处理

3、程序对源程序中所有n用用100替换。替换。例:例:使用不带参数的宏定义。使用不带参数的宏定义。 #define n 10 void main() int an,i; for(i=0;in;i+)ai=i* *i; for(i=0;iy?x:yvoid main ( ) int i ,j ,k; i=5; j=10; k=10* *m(i, j); /* 展开:展开:k=10*510?5:10; */ printf (“%dn”,k) 说明:说明:1)调用带参数的宏时,实参与形参的个数应相同。调用带参数的宏时,实参与形参的个数应相同。 2)实参可以是常量、变量或表达式形式。实参可以是常量、变量或

4、表达式形式。3)带参数宏替换与函数调用有类似之处,但前者对参带参数宏替换与函数调用有类似之处,但前者对参 数没有类型的要求。数没有类型的要求。4)宏替换中,实参不能替换双引号中的形参。宏替换中,实参不能替换双引号中的形参。5)与不带参数的宏定义一样,同一个宏名不能重复定与不带参数的宏定义一样,同一个宏名不能重复定 义。义。(3) 终止宏定义形式终止宏定义形式 #undef 已定义宏名已定义宏名例如:例如: #define pi 3.14159 main( ) #undef pi从终止宏定义从终止宏定义(#undef pi)后后pi无定义,不代表无定义,不代表3.14159了。了。使用宏定义的优

5、势:使用宏定义的优势: 1) 宏替换不占程序运行时间,只占编译时间。宏替换不占程序运行时间,只占编译时间。 2) 便于阅读便于阅读 3) 修改方便修改方便注意:注意: 宏定义最后没有宏定义最后没有“ ;” 。2. 文件包含文件包含 就是在一个文件中,将已有的另外一个文件的全部就是在一个文件中,将已有的另外一个文件的全部内容包含进来。内容包含进来。 由于由于c的库函数很多,将这些函数根据类型不同分的库函数很多,将这些函数根据类型不同分类类, 分别放在不同的文件中分别放在不同的文件中(例如例如, 数学函数:数学函数:math.h 、输入输入/出:出: stdio.h 、 字符函数:字符函数: ct

6、ype.h 、字符串:、字符串:string.h 、动态分配:、动态分配:malloc.h 其它:其它:tdlib.h 。),编程时,使用哪个文件中的函数编程时,使用哪个文件中的函数, 将该文件用文件包含将该文件用文件包含的形式,写在程序的前面的形式,写在程序的前面。 c语言提供了语言提供了#include 命令行,命令行, 实现实现“文件包含文件包含”功功能,其一般形式为能,其一般形式为: #include “文件名文件名” 或或 #include 编译预程序将用指定的文件中的内容替换此命令行。编译预程序将用指定的文件中的内容替换此命令行。 如果文件名用双引号括起来时,系统先在用户当前如果文

7、件名用双引号括起来时,系统先在用户当前目录查找要包含的文件,若找不到,再按标准方式(系目录查找要包含的文件,若找不到,再按标准方式(系统指定的目录)查找;如果文件名用尖括号括起来时,统指定的目录)查找;如果文件名用尖括号括起来时,按标准方式查找。按标准方式查找。说明:说明:1) #include 命令行的位置一般写在源程序的开头,文命令行的位置一般写在源程序的开头,文 件名后缀不一定是件名后缀不一定是“.h”。2) 包含文件包含文件(头文件头文件)中,可包含一些中,可包含一些 #define 命令行、命令行、 外部说明或对库函数的原形说明。外部说明或对库函数的原形说明。例例: 将格式宏做成头文

8、件将格式宏做成头文件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”,s

9、t) */ pr(nl); /* 展开:展开:printf(“n”) */ 3)3)当当包含文件包含文件(头文件头文件)修改后,对包含头文件的源程序修改后,对包含头文件的源程序 必须重进行编译连接。必须重进行编译连接。4)4)在在一个程序中允许有多个一个程序中允许有多个#include 命令行。命令行。5)5)在在包含文件包含文件(头文件头文件)中还可以其他文件。中还可以其他文件。 例:例:在在包含文件包含文件(头文件头文件) file2.h中包含文件中包含文件file3.h 。 见下面图示:见下面图示: file1.c file2.h file3.h #include “file2.h ”

10、#include “file3.h ” 不含不含#include命令行命令行 例:例:文件包含的程序。文件包含的程序。#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); 说明:说明:包含文件也可以是包含文件也可以是自己自己编的一些函数,放在一编的一些函数,放在一个文件中个文件中,使用时只要,使用时只要在程序前部包含进去,在程序前部

11、包含进去,文件中的函数可以在程文件中的函数可以在程序中调用,节省程序开序中调用,节省程序开发时间。发时间。3. 条件编译条件编译 有条件的对源程序的某部分进行编译,减少目标代有条件的对源程序的某部分进行编译,减少目标代码的存储空间。有三种形式:码的存储空间。有三种形式:形式形式1: #ifdef 标识符标识符 程序段程序段1 #else 程序段程序段2 #endif 标识符标识符 #define 定义过,则程序段定义过,则程序段1被编译,否则被编译,否则,程序段,程序段2被编译。被编译。可选可选形式形式2: #ifndf 标识符标识符 程序段程序段1 #else 程序段程序段2 #endif

12、标识符没用标识符没用#define 定义过,则程序段定义过,则程序段1被编译,被编译,否则,程序段否则,程序段2被编译。被编译。 形式形式3: #if 表达式表达式 程序段程序段1 #else 程序段程序段2 #endif 表达式为非表达式为非0,则程序段,则程序段1被编译,否则,程序段被编译,否则,程序段2被编译。被编译。13.2 动态存储分配动态存储分配 在程序执行期间根据需要可动态分配存储空间在程序执行期间根据需要可动态分配存储空间,不不用时可释放。用时可释放。c语言提供的四个标准函数:语言提供的四个标准函数:malloc 、calloc 、free 和和 realloc 可实现前述功能

13、。可实现前述功能。1. malloc函数和函数和free函数函数(1) malloc函数调用形式函数调用形式 malloc(size);其中其中: size 它的类型为它的类型为unsinged int 。功能:分配功能:分配size个字节存储间。返回指向存储空间首地个字节存储间。返回指向存储空间首地 址的基类型为址的基类型为void的地址。若分配的存储空间不的地址。若分配的存储空间不 足,函数返回空足,函数返回空(null)。(2) free函数调用形式函数调用形式 free(p);其中其中: p 类型为指针变量,指向动态分配的地址。类型为指针变量,指向动态分配的地址。功能:将指针功能:将指

14、针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 类型均为类型均为unsinged int 。功能:给功能:给n个同一类型长度为个同一类型长度为size个字节的数据项分配个字节

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论