第9章预编译及第12章位运算--C语言程序设计(谭浩强第三版)剖析讲解

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

• #undef可#d终ef止ine宏名P作I 用例域3.#1d4e1f5in9e26 YES 1
格式: ##duenfdineef 宏OU名T例mp#radininet(ffi()n“HeelWlo,IWDToHrld”)8;0

{ …#d…efi.n. e LENGTH (WIYDETSH原+4作0用) 域 宏展开:预编译时,用宏体}替v换ar=宏L名EN--G-不TH作*2语; 法检查
……. 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); ……… }
• 带参的宏与函数区别
main()
• 功能:根据指定的标识{符ch是ar否str被[20定]="义C过La,ng确uag定e"在,程c; 序编译
阶段编译哪一段程序段。int i;
• 形式1:#if 表达式
程序段1
#else 程序段2
iw=h0i–le形((c式=st3r:[i])!#i=fn′\0d′e) f 标识符
{i++;
• 文件包含可嵌套
#include “file2.c” #include “file3.c”
A
B
file1.c
file2.c
C file3.c
file3.c file2.c
A
file1.c
9.3 条件编译
例9.7 根据需要设置条件编译,能将字母全 改为大写输出,或全改为小写字母输出。
#define LETTER 1
•••例如展宏引宏开定号定例宏#后义中义d展e:可的中pf#i开nrd嵌内使iene:eetiif套容用fflli(((ssnpMxx“ee2, 与 必er==iA*n==iiPff不 宏 要Xt1YPf((I()xx=E“能 名 的I==2%S*==递 相 括MP)f3N0\nAI.归 同 号)宏=O1”X,4%)不(P展p##m{}+1…fIrudp15\*a需)i开nnner209…xpip”tdfn)置(fi,:rr;n()3et.iif“n.ne.f(换cv1“ttoffea4((Yr“rr“1rcYr=eEeo5orEcSr(9rr8!otSr*\!0enr\2n!+c”)\)(”n;t4;)!0”\;0n)));”*)2;; YES新作用域
例:在调试程序时,常常希望输出一些所需的信息,而在调试 完成后不再输出这些信息,可在源程序中插入以下的条件编 译段:
#ifdef DEBUG printf(”x=%d,y=%d,z=%d\n”,x,y,z);
#endif
1、有以下程序
– 系统头文件 如:#include<stdio.h>
– 用户自定义头文件 如: #include“myhead.h”
头文件应包含如下一些内容:
• 类型定义 • 函数原型
头文件不能包含以下内容:
• 内联函数声明 • 全局数据声明 • 常量定义
• 一般函数定义 • 数据定义
• 包含指令
• 宏定义
• 注释
或 #include <文件名>
• 处理过程:预编译时,用被包含文件的内容取代该预 处理命令,再对“包含”后的文件作一个源文件编译
#include “file2.c” A
file1.c
B file2.c
file2.c A file1.c
• 被包含文件内容
• 源文件(*.c) • 头文件(*.h)
如:#include“file2.c”
带参宏
函数
处理时间 预编译时
程序运行时
参数类型 处理过程
程序长度
无类型问题
定义实参,形参类型
不分配内存
分配内存
简单的字符置换 先求实参值,再代入形参
变长
不变
运行速度 不占运行时间 调用和返回占时间
<> 直接按标准目录搜索 “” 先在当前目录搜索,再搜索标准目录
9.2 文件包含
• 功能:一个源文件可将另一个源文件的内容全部包含 • 一般形式: #include “文件名”
• 带参数宏定义
• 一般形式: #define 宏名(参数表) 宏体
例 #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);
程序段1
#if LETTER#else
if(c>=′a′ && c程<=序′Z段′) 2
#e百度文库dif
c=c-32; #endif
• 形式2:#ifdef 标识符
程序段1
#else if(c>=′A′ && c<=′Z′) c=c+32;
#else 程序段2
#endif
#endif printf("%c",c); } }
9.1 宏定义
• 不带参数宏定义
• 一般形式: #define 宏名 宏体
• 功能:用指定标识符(宏名)代替字符序列(宏体)

• •
宏一定名般义如中用位不大置#允写:d一e许字f般in有 母e在空 。程Y格序E,S开而例头1且##v必dadere须=ffiiLnn遵EeeN循GWLCETI变DHNT量*G2HT;命H名80W规I则DT。H宏+4名0 作用域:从#d定efi义ne命令N到O文宏件0展结开束:var= 80+40 *2;
宏展开: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;
其他内容:
❖第9章 ❖第12章 ❖第14章 ❖附录
编译预处理 位运算 调试中的错误
第9章 编译预处理
• 作用:对源程序编译之前,对#开头的命令做一些预处理 • 种类:
• 宏定义 #define • 文件包含 #include • 条件编译 #if--#else--#endif等
• 格式:
• “#”开头 • 占单独书写行 • 语句尾不加分号
相关文档
最新文档