c语言编译预处理全解ppt课件.ppt

上传人:小飞机 文档编号:1375864 上传时间:2022-11-16 格式:PPT 页数:22 大小:301.50KB
返回 下载 相关 举报
c语言编译预处理全解ppt课件.ppt_第1页
第1页 / 共22页
c语言编译预处理全解ppt课件.ppt_第2页
第2页 / 共22页
c语言编译预处理全解ppt课件.ppt_第3页
第3页 / 共22页
c语言编译预处理全解ppt课件.ppt_第4页
第4页 / 共22页
c语言编译预处理全解ppt课件.ppt_第5页
第5页 / 共22页
点击查看更多>>
资源描述

《c语言编译预处理全解ppt课件.ppt》由会员分享,可在线阅读,更多相关《c语言编译预处理全解ppt课件.ppt(22页珍藏版)》请在三一办公上搜索。

1、C语言程序设计,第8章 编译预处理,问题:实际生活中,为了更好地处理一些事件或数据,会对其提前进行设定和准备,如:,用代表圆周率3.14为避免重复,对已有的实行“拿来主义”。,ANSI C标准规定可以在源程序中加入一些“预处理命令” ,以改进程序设计环境,提高编程效率。,引子,本章重点,第8章 编译预处理,本章难点,宏定义命令 条件编译命令 文件包含命令,带参宏定义 条件编译,编译预处理,作用:对源程序编译之前做一些处理,生成扩展C源程序种类宏定义 #define文件包含 #include条件编译 #if-#else-#endif等格式:“#”开头占单独书写行语句尾不加分号,8.1,8.2,8

2、.3,宏定义,条件编译,文件包含,第8章 编译预处理,如 if(x=YES) printf(“correct!n”); else if (x=NO) printf(“error!n”);展开后: if(x=1) printf(“correct!n”); else if (x=0) printf(“error!n”);,宏定义的分类无参数宏定义一般形式: #define 标识符 替换文本功能:用指定标识符(宏名)代替替换文本(宏体),宏展开:预编译时,用宏体替换宏名-不作语法检查,如 #define YES 1 #define NO 0 #define PI 3.1415926 #define

3、OUT printf(“Hello,World”);,宏体可缺省,表示宏名定义过或取消宏体,定义位置:任意(一般在函数外面)作用域:从定义命令到文件结束#undef可终止宏名作用域 格式: #undef 标识符,宏定义可嵌套,不能递归,例 #define MAX MAX+10 (),引号中的内容与宏名相同也不置换,例 #define PI 3.14159 printf(“2*PI=%fn”,PI*2);宏展开:printf(“2*PI=%fn”,3.14159*2);,宏定义中使用必要的括号(),例 #define WIDTH 80 #define LENGTH WIDTH+40 var=LE

4、NGTH*2;宏展开:var= 80+40 *2;,8.1 宏定义,例8.1 用不带参数的宏定义计算s=3*(y*y+3*y)+4*(y*y+3*y)+5*(y*y+3*y),#define M (y*y+3*y)main() int s,y; printf(Please input a number: ); scanf(%d,运行情况如下:Please input a number: 4s=336,算法分析:单在计算式子中出现了三个(y*y+3*y),为减少书写量,可使用宏定义。,带参数宏定义一般形式: #define 宏名(参数表) 替换文本,例 #define S (r) PI*r*r相

5、当于定义了不带参宏S,代表字符串“(r) PI*r*r”,宏展开:形参用实参换,其它字符保留宏体及各形参外一般应加括号(),例 #define S(a,b) a*b . area=S(3,2);宏展开: area=3*2;,不能加空格,例 #define POWER(x) x*x x=4; y=6; z=POWER(x+y);宏展开:z=x+y*x+y;一般写成: #define POWER(x) (x)*(x)宏展开: z=(x+y)*(x+y);,8.1 宏定义,#define MAX(x,y) (x)(y)?(x):(y) main() int x,y,max; printf(input

6、 two numbers(x,y): ); scanf(%d,%d,例8.4 用带参宏定义求两数中的大者。,运行情况如下:input two numbers(x,y): 5,6max=6,例8.5 一个宏定义代表多条语句。,#define SSSV(s1,s2,s3,v) s1=l*w; s2=l*h; s3=w*h; v=w*l*h;main() int l=3,w=4,h=5,sa,sb,sc,vv; SSSV(sa,sb,sc,vv); printf(sa=%dnsb=%dnsc=%dnvv=%dn,sa,sb,sc,vv);,运行情况如下:sa=12sb=15sc=20vv=60,带参

7、的宏与函数区别,8.1,8.2,8.3,宏定义,条件编译,文件包含,第8章 编译预处理,条件编译的功能:在编译源文件之前,根据给定的条件决定编译的范围。形式一: #ifdef 标识符 程序段1 #else 程序段2 #endif,如果标识符是已被 #define命令定义过的宏名,就对程序段1进行编译;否则对程序段2进行编译。,8.2 条件编译,条件编译举例,#define DEBUG main() int a=4; #ifdef DEBUG printf(Now the programmer is debugging the program.); #else printf(a=%d.,a);

8、#endif,若没有第一行的宏定义命令,程序运行后会输出:a=4.,运行情况如下:Now the programmer is debugging the program.,条件编译形式二:#ifndef 标识符 程序段1 #else 程序段2 #endif,如果标识符未被#define命令定义过,就对程序段1进行编译;否则对程序段2进行编译。,形式三:#if 常量表达式 程序段1 #else 程序段2 #endif,如果常量表达式的值为真(非0),就对程序段1进行编译;否则对程序段2进行编译。,例8.10 设置一个开关,判断输入值是半径还是边长,实现求圆或正方形的面积。,#define R 1

9、main() float c,r,s; printf (input a number:); scanf(%f, #endif,运行情况如下:input a number:3area of round is: 28.274309,若程序的第一行改为:#define R 0则程序运行情况如下:input a number:3area of square is: 9.000000,条件编译的应用一套程序要产生不同的版本(如演示版本和实际版本)、避免重复定义时,往往使用条件编译。,在程序调试时,经常需要查看某些变量的中间结果。这时可以使用条件编译,在程序中设置若干调试用的语句。例如:#define F

10、LAG 1 #if FLAG printf(a=%d,a);#endif,8.1,8.2,8.3,宏定义,条件编译,文件包含,第8章 编译预处理,文件包含的功能:一个源文件可将另一个源文件的内容全部包含进来。一般形式: #include “文件名” 或 #include ,处理过程:预编译时,用被包含文件的内容取代该预处理命令,再对“包含”后的文件作一个源文件编译。,“” 先在当前目录搜索,再搜索标准目录;可指定路径 直接按标准目录搜索,不能指定路径,8.3 文件包含,例 #include C:TCF2.c #include ,被包含文件内容源文件(*.c)头文件(*.h),stdio.h:E

11、OF和NULL宏定义及输入输出函数的原型 math.h:各个数学函数的原型 io.h:数据类型struct ftime的定义,文件包含可嵌套,将那些公用的或常用的宏定义、函数原型、数据类型定义及全局变量的定义和声明等,组织在一些头文件中,在程序需要使用到这些信息时,就用#include命令把它们包含到所需的位置上去,从而免去每次使用它们时都要重新定义或声明的麻烦。,例8.11 用户头文件的编写和使用,#ifndef _L8_11_H/*定义宏,以防止重复包含此头文件*/ #define _L8_11_H #include #define ADD(a,b) (a)+(b) /*定义宏,实现两数的

12、加法*/ #define SUB(a,b) (a)-(b) /*定义宏,实现两数的减法*/ int MUL(int a,int b) /*定义函数,实现两数的乘法*/ return a*b; float DIV(float a,float b) /*定义函数,实现两数的除法*/ if(b!=0) return a/b; else printf(Error! The deno cannot be zero!); #endif,头文件 L8_11.h,#include L8_11.h /*包含自定义头文件*/main() int a,b; int sum,product; float differ

13、ence,quotient; printf(Please input two numbers:); scanf(%d,%d,程序运行情况如下:Please input two numbers:34,12sum=46 difference=22.000000product=408 quotient=2.833333,注意一个#include命令只能包含一个头文件,若有多个文件要包含,则需用多个#include命令。例如:如果file1.c中包含file2.c,而file2.c中要用到file3.c的内容则可在file1.c中用两个#include命令进行包含,包含顺序如下:#include file3.c#include file2.c当某个头文件的内容发生变化时,意味着包含该头文件的源程序也发生变化,所以需要重新编译。,本章小结,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号