编译预处理44805

上传人:仙*** 文档编号:248294657 上传时间:2024-10-23 格式:PPT 页数:18 大小:479KB
返回 下载 相关 举报
编译预处理44805_第1页
第1页 / 共18页
编译预处理44805_第2页
第2页 / 共18页
编译预处理44805_第3页
第3页 / 共18页
点击查看更多>>
资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,编译预处理,宏定义,文 件 包 含,条 件 编 译,小结,编译预处理,作用:,对源程序编译之前做一些处理,生成扩展,C,源程序,宏定义,#define,文件包含,#include,条件编译,#if-#else-#endif,等,格式:,“,#,”,开头,占单独书写行,语句尾不加分号,如,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”);,6.1.2,不带参数宏定义,一般形式:,#define,宏名,宏体,功能,:,用指定标识符,(,宏名,),代替字符序列,(,宏体,),宏展开:预编译时,用宏体替换宏名,-,不作语法检查,如,#define YES 1,#define NO 0,#define PI 3.1415926,#define OUT printf(“Hello,World”);,宏体可缺省,表示宏名,定义过或取消宏体,定义位置,:,任意,(,一般在函数外面),作用域:从定义命令到文件结束,#,undef,可,终止宏名作用域,格式:,#undef,宏名,例,#define YES 1,main(), .,#undef YES,#define YES 0,max(),.,YES,原作用域,YES,新作用域,宏定义可嵌套,不能递归,例,#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=LENGTH*2;,宏展开:,var= 80+40 *2;,( ),( ),例,#define,WIDTH,80,#define,LENGTH,WIDTH,+40,var=LENGTH*2;,宏展开:,var= 80+40 *2;,7.1,宏定义,例,7.1,分别输出,5,个实数中的最大值和最小值以及它们的差。,#include ,#define PR printf,#define CR PR(n),#define CR2 CR;CR,void main(), float max,min,x;,int i,n;,n=5;,scanf(%f,max=min=x;,for(i=2; imax) max=x;,if(x=c,void main(), float x,y,z;,scanf(%f%f%f,if(f(x,y,z)&f(x,z,y)&f(y,z,x),/,宏展开为:,if(x+y=z&x+z=y&y+z=x),printf(yesn);,else,printf(non);,例,7.3,写出下列程序的输出结果。,#include ,#define f(a,b) a*b,void main(), float x=2,y=3,z;,z=f(x,y);,/,宏展开为:,z=x*y,;正确!,printf(%ft,z);,z=f(x+1,y+1);,/,宏展开为:,z=x+1*y+1,;错误!,printf(%fn,z);,程序运行:,6.000000 6.000000,例,l7-3d1.c,写出下列程序的输出结果,#include ,#define f(a,b) a*b,void main(), float x=2,y=3,z;,z=f(x,y);printf(“%ft”,z);,z=f(x*x+2*x-5,y+3);,printf(“%fn”,z);,例,l7-3d2.c:,求,27,除以,3,的平方,#define SQUARE(n) (n)*(n),main(), printf(,%fn,27.0/SQUARE(3.0);,运行结果:,6.000000,-4.00000,运行结果:,27.000000,例,l7-3d3.c,#include ,#include ,#define POWER(x,y) pow(x,y)*y,#define ONE 1,#define SELEVE_ADD(x) +x,main(),int x=2;,printf(%fn,POWER(SELEVE_ADD(x),ONE+1);,展开后:,Pow(+x,1+1)*1+1,运行结果:,10.000000,例,l7-3d4.c,#include ,#define FUDGE(k) k+3.14159,#define PR(a) printf(a=%dn,(int)(a),#define PRINT(a) PR(a);putchar(n);,#define PRINT2(a,b) PR(a);PR(b);,#define PRINT3(a,b,c) PR(a);PRINT2(b,c),#define MAX(a,b) (ab?b:a),main(), int x=2;,PRINT(x*FUDGE(2); ,int cel;,for(cel=0;cel=100;cel+=50),PRINT2(cel,9/5*cel+32); ,int x=1,y=2;,PRINT3(MAX(x+,y),x,y);,PRINT3(MAX(x+,y),x,y); ,展开后:,for(cel=0;cel=100;cel+=50),printf(“a=%dn”,(int)(cel); printf(“a=%dn”,(int)(9/5*cel+32);,展开后,printf(“a=%dn”,(int)(x+(y)?(x):(y),.,main(), int a,b,c,d,t;,.,t=MAX(a+b,c+d);,宏展开:,t=(a+b)(c+d)?(a+b):(c+d);,int max(int x,int y), return(xy?x:y);,main(), int a,b,c,d,t;,.,t=max(a+b,c+d);,例 用宏定义和函数实现同样的功能,带参数的宏定义与函数的区别,函数调用时,先求出实参表达式的值,然后传递给形参,使用带参的宏只是进行简单的字符替换,带参的宏与函数区别,带参宏,函数,处理过程,不分配内存,简单的字符置换,分配内存,先求实参值,再代入形参,处理时间,编译时,程序运行时,参数类型,无类型问题,定义实参,形参类型,程序长度,变长,不变,运行速度,不占运行时间,调用和返回占时间,7.2,文件包含,功能:一个源文件可将另一个源文件的内容全部包含进来,一般形式:,#include “,文件名,”,或,#include ,#include “file2.c”,file1.c,file2.c,file1.c,file2.c,A,B,A,处理过程:预编译时,用被包含文件的内容取代该预处理命令,再对“包含”后的文件作一个源文件编译,直接按标准目录搜索,“”,先在,当前目录,搜索,再搜索标准目录,可指定路径,常用包含文件,ctype.h-,字符处理函数,math.h-,数学函数,stdio.h-,标准输入,/,输出函数,stdlib.h-,常用函数库,string.h-,字符串处理函数,被包含文件内容,源文件,(*.c),头文件,(*.h),宏定义,数据结构定义,函数说明等,文件包含可嵌套,#include “file2.c”,file1.c,A,file3.c,C,#include “file3.c”,file2.c,B,file1.c,A,file3.c,file2.c,例,7.4,一个程序写在多个源文件中的应用举例。,源文件,prg1.c,#include ,#include “prg1_1.c”,#include “prg1_2.c”,void main(),printf(“%dn”,g1(7);,printf(“%dn”,g2(7);,源文件,prg1_1.c,int g1(int k), int s=0,i=1;,for(;i=k;i+),s+=i;,return s;,源文件,prg1_2.c,int g2(int m), int s=0,i=1;,for(;i=m;i+),s+=i*i;,return s;,例 文件包含举例,/* powers.h */,#define sqr(x) (x)*(x),#define cube(x) (x)*(x)*(x),#define quad(x) (x)*(x)*(x)*(x),/*l7-4d1.c*/,#include ,#include “powers.h”,void main(), int n;,printf(numbert exp2t exp3t exp4n);,printf(-t-t-t-n);,for(n=1;n=10;n+),printf(%2dt %3dt %4dt %5dn,n,sqr(n),cube(n),quad(n),);,*7.3,条件编译,功能:根据条件确定编译的语句组,一般形式:,1.,#ifdef,标识符,程序段,1,#else,程序段,2,#endif,2.,#ifndef,标识符,程序段,1,#else,程序段,2,#endif,功能:当,标识符,已经,被定义过,则“,程序段,1,”,被编译,否则,“,程序段,2,”,被编译。,“,#else,分支”,可省略,。,功能:当,标识符,没有,被定义过,则“,程序段,1,”,被编译,否则,“,程序段,2,”,被编译。,“,#else,分支”,可省略,。,例:,#ifdef DEBUG,printf(x=%d, y=%d, z=%dn,x,y,z);,#endif,只要在程序的起始处有以下命令行:,#define DEBUG,程序在运行中就会输出,x,、,y,、,z,的值,以便调试时分析。,例:,/* Define NULL pointer value */,#ifndef NULL,#ifdef _cplusplus,#define NULL 0,#else,#define NULL (void *)0),#endif,#endif,如果指针常数“,NULL”,之前没有被定义,则根据不同的编译环境,给出不同的定义。,
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 管理文书 > 施工组织


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!