- 1、本文档共26页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第13章 编译预处理和动态分配 宏展开:预编译时,用替换文本替换宏名---不作语法检查 宏定义中使用必要的括号() 说明: ① 宏名一般用大写字母。这不是语法规定,只是一种习惯。 ② 可以使用宏名代替一个字符串 ③ 当宏定义在一行中写不下,需要在下一行继续时,只需 在最后一个字符后紧接一个反斜线“\”。例如: #define YEAR year % 4==0\ year %100!=0 || year % 400==0 注意在第二行开始不要有空格,否则空格会一起被替换。 ④ 宏名的有效范围为定义命令之后到本源文件结束,除非用#undef命令终止宏名的作用域。 ⑤ 对程序中用双引号括起来的字符串内的子串和用户标识符中的成分不做替换。 ⑥ 同一个宏名不能重复定义。 一般形式: #define 宏名(参数表) 替换文本 例: #define F(x) 3*x+5 main() { printf(“%d”,2*F(3+6)); } 答案:2*3*x+5 = 2*3*3+6+5 = 29 题(35)有以下程序 #include #define SUB(a) (a)-(a) main() { int a=2,b=3,c=5,d; d=SUB(a+b)*c; printf(%d\n,d); } 程序运行后的输出结果是 文件包含 功能:一个源文件可将另一个源文件的内容全部包含进来 一般形式: #include “文件名” 或 #include 文件名 处理过程:预编译时,用被包含文件的内容取代该预处理命令,再对“包含”后的文件作一个源文件编译 被包含文件内容: 源文件(*.c) 头文件(*.h) 文件包含可嵌套 “条件编译”:一般情况下,源程序中的所有行都参加编译,但特殊情况下可能需要根据不同的条件编译源程序中的不同部分,也就是说对源程序的一部分内容给定一定的编译条件。这种方式称作“条件编译”。 内存分配函数 2、动态内存分配函数 以下函数在malloc.h或stdlib.h中定义: void *malloc(x) 分配一个长度为x字节的连续空间,分配成功返回起始地址指针,分配失败(内存不足)返回NULL void *calloc(n,x) 分配n个长度为x字节的连续空间(成败结果同上) void *realloc(p,x) 将p所指的已分配空间大小调整为x个字节 void free(p) 将由以上各函数申请的以p为首地址的内存空间全部释放 int *p1,*p2; p1=(int *)malloc(5);/* */ p2=(int *)calloc(2,5); /* */ free(p1);free(p2);//释放p1,p2 * * 编译预处理 目的: 为了简化程序的编写,提高程序的可移植性、可读性、模块化。 C语言设计了若干命令–––编译预处理命令,并可出现于程序当中。 作用:对源程序编译之前做一些处理,生成扩展C源程序 1. 宏定义命令 #define 有三种类型的预处理命令: 2. 文件包含命令 #include 3. 条件编译命令 #if--#else--#endif 【编译】C编译系统对源程序进行:词法和语法分析,代码生成,优化 → .OBJ文件 【编译预处理】编译前对源程序进行一些预加工(改善程序设计环境/模块化设计) 格式: “#”开头 占单独书写行 语句尾不加分号 可出现在程序的任何位置 作用范围:出现点至所在源程序未尾 为了与C语句区别,这些命令均以“#”开头。 处理流程: 第一次编译扫描时,将预编译命令处理完,然后再进行正式编译,生成目标代码。 §13.1 宏替换 宏替换分为: 无参数和有参数二种形式。 一、无参形式 一般形式: #define 宏名 替换文本 功能:宏替换是用宏名来表示一个替换文本,在宏展开时又 以该替换文本取代宏名,只是一种简单的代换。 说明: 1、define、宏名、替换文本之间用空格隔开 2、宏替换必须写在函数之外。 3、作用域:其作用域为从宏替换起到源程序结束。 4、在行末不加分号。 如 #define N 10 /* 注意后面没有分号 */ 即:把程序中的 N替换成10,而不是N的值等于10,N不是变量,它是常量。在程序正式运行之前进行替换。 例 #define A 80 #define B (A+40) m=B*2; 宏展开:m= 80+4
文档评论(0)