C语言课件(谭浩强):第七章 编译预处理
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
YES新作用域
带参数宏定义
❖一般形式: #define 宏名(参数表) 宏体
例 #define S(a,b) a*b
不能加空格
………..
area=S(3,2); 宏展开: area=3*2;
❖宏展开:形参用实参换,其它字符保留
❖宏体及各形参外一般应加括号()
例 #define S (r) PI*r*r 相当例于定#d义efi了ne不带PO参W宏ESR,(代x)表字x符*x串“(r) PI*r*r”
x=4; y=6;
z=POWER(x+y); 宏展开:z=x+y*x+y; 一般写成: #define POWER(x) ((x)*(x)) 宏展开: z=((x+y)*(x+y));
例 用宏定义和函数实现同样的功能
#define MAX(x,y) (x)>(y)?(x):(y) ……. main() { int a,b,c,d,t;
❖宏格展式开例::例##预dd###eedud编ffieiennnffed译eiinneee时WfLEWIL,DN用EIT宏GDNH{}宏TTG…名HHT体8…H0W8替..0(WID换ITD宏HT+H名4+04--0-)不作Y语ES法原检作查用域
❖❖❖例如展宏引宏开定号定例宏#后d展义中义e宏:pf#i开nr可 的 中d宏展iene:veetii展嵌内使f开ffalli(((ssnpvMxx“r开ee:=2aer=套容用=iA*rnL==ii:=PffvXtE1Y,与必PfaL((I(N)xxv=E“rEI==2=a%不宏要GSN*=r=M8=P)Tf3GN0\能名的0nHAI.)(T=O1+8”X*,%4H4递相括0)2Pp##m{}+10+…*;fIrudp152\*a4i归同号n*nner209;…x0p2ip”tdfn))(fi,r;r;也(n()3et*.iif“n.n2e.f(c1“tt;不)offe4((Yr“r“1rcYre置Eeo5orEcSr9rr!otS换r*\!enr\2n!c”)\)(”n;t;)!0”\;))n;”);
/*ch8_10.c*/ #include <stdio.h> #include "d:\fengyi\bkc\powers.h" #define MAX_POWER 10 void main() { int n;
printf("number\t exp2\t exp3\t exp4\n"); printf("----\t----\t-----\t------\n"); for(n=1;n<=MAX_POWER;n++) printf("%2d\t %3d\t %4d\t %5d\n",n,sqr(n),cube(n),quad(n)); }
文件包含可嵌套
宏定义 数据结构定义 函数说明等
file3.c file2.c
A
file1.c
#include “file2.c” #include “file3.c”
A
B
file1.c
file2.c
C file3.c
例 文件包含举例
/* powers.h */ #define sqr(x) ((x)*(x)) #define cube(x) ((x)*(x)*(x)) #define quad(x) ((x)*(x)*(x)*(x))
第七章 编译预处理
作用:对源程序编译之前做一些处理,生成扩展C 源程序
种类
❖宏定义 #define ❖文件包含 #include ❖条件编译 #if--#else--#endif等
格式:
❖“#”开头 ❖占单独书写行 ❖语句尾不加分号
§7.1 宏定义
不带参数宏定义
宏体可缺省,表示宏名 定义过或取消宏体
……. t=MAX(a+b,c+d); …… } 宏展开:t=(a+b)>(c+d)?(a+b):(c+d);
int max(int x,int y) { return(x>y?x:y); } main() { int a,b,c,d,t;
……. t=max(a+b,c+d); ……… }
<>
❖带参的宏与函数区别
带参宏
函数
处理时间Baidu Nhomakorabea编译时
程序运行时
参数类型 处理过程
程序长度
无类型问题
定义实参,形参类型
不分配内存
分配内存
简单的字符置换 先求实参值,再代入形参
变长
不变
运行速度 不占运行时间 调用和返回占时间
<>
§7.2 文件包含
功能:一个源文件<> 可直将接另按标一准个目录源搜文索件的内容全部
包含进来
“” 先在当前目录搜索,再搜索标准目录 可指定路径
❖一般形式: #define 宏名 [宏体]
❖功能:用指定标识符(宏名)代替字符序列(宏体)
❖定如义位#置def:i任ne意Y(一ES般1在函数外面)
❖作用域##dd:从eeffiinn定ee 义命NPIO令到30.1文41件59结26束
❖#unde#fd可ef终ine止宏OU名T例作用mp#rdai域neintffi((n)“He ellYo,EWSorld”)1;
一般形式: #include “文件名”
或 #include <文件名> 处理过程:预编译时,用被包含文件的内容取代
该预处理命令,再对“包含”后的文件作一个源 文件编译
#include “file2.c” A
file1.c
B file2.c
file2.c A file1.c
被包含文件内容
❖源文件(*.c) ❖头文件(*.h)