55C语言 第10章PPT课件

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#define 宏名(参数表) 字符序列 例如,定义一个计算圆面积的宏:
#define PI 3.1415926536 #define area(r) (PI * r * r)
例 10-2 : 下 面 的 程 序 中 使 用 了 带 参 数 的 宏 , 它 计 算并输出给定半径的圆的面积。
#define PI 3.1415926536 #define area(r) (PI*r*r)
第10章 预处理、输入/输出 和文件操作
C语言的预处理功能由C编译的预处理程序实现, 负责分析和处理行首以“#”号开头的控制行。这些控 制行包括宏替换、文件包含和条件编译等。
C语言中并没有专门用于输入/输出的语句。为了 给出方便的程序接口,C语言中提供了“标准I/O库”, 它是一组函数,可提供一系列I/O服务。
void main() {
float r; printf("Input:r=?\n"); scanf("%f",&r); printf("Area=%f\n",area(r)); }
② 带参数的宏替换与简单的宏替换在替换规则上 是一致的,都是机械地进行替换,而不去理解用户的 想法。
例10-4:本例说明宏替换可能存在副作用。 #define PI 3.1415926536 #define area(r) (PI*r*r)
#define N 50
#define PI 3.1415926
… int a[N]; double r,l;
… l = 2*PI*r;

经过宏替换之后,上述代码实际上就变成: … int a[50]; double r,l; … l=2*3.1415926*r; …
有关宏的定义和使用要注意以下几点: ① 宏定义在源程序中要单独占用一行,通常“#” 号出现在一行的第一个字符的位置,允许在#号的前面 有若干空格或制表符,但不允许有其他字符。 ② 宏名用大、小写字母标识都行,为醒目起见, 往往用大写字母表示。 ③ 用双引号括起来的标识符不做宏替换。例如:
退出
10.1 预处理功能 10.2 文 件 包 含 10.3 条 件 编 译 10.4 其他预处理功能 10.5 库函数使用方式 10.6 常用标准输入/输出函数 10.7 文件及有关操作 10.8 其他一些常用的函数(宏)
10.1 预处理功能
10.1.1 简单宏定义和宏替换 简单宏定义的一般形式是:
#define TRUE 1 则打印语句
printf("TRUE"); 会打印出TRUE,而不是1。
④ 宏定义可以嵌套。例如:
#define PI 3.1415926 #define TWOPI ( 2*PI ) 在预处理后,语句 c1=TWOPI * r; 便替换成 c1=( 2 * 3.1415926 ) * r; ⑤ 宏替换只是按原来的定义“机械地”进行替换, Байду номын сангаас管替换后的结果是对还是错。例如: #define A 3+2 那么 5/A 被替换成 5/3+2
void main() {
printf("%f\n",area(6.18)); }
2.几点使用说明 ① 使用宏定义时所带的实参可以是常量、已被赋 值的变量名或者表达式。 例10-3:将例10-2的程序改写为交互式输入半径值 的方式。
#define PI 3.1415926536 #define area(r) (PI*r*r)
④ 使用带参数的宏编写程序时,应注意:在宏定 义中宏名和左圆括号之间没有空格。我们看一下如下 宏定义:
#define area (r) (PI *(r)*(r)) 在area和“(”之间有空格。
例如, x = area(5.6);
void main() {
printf("%f\n",area(4+6)); }
为了避免出现与常规理解上的不一致,建议对宏 定义中字符序列的整体和各个参数都用圆括号括起来。 例如,
#define area(r) (PI*(r)*(r)) 那么, area(4+6)将被替换为:
(3.1415926536*(4+6)*(4+6)) ③ 一个宏定义所带的参数可以多于一个,每个参 数在宏替换中可以出现多次。 #define AVG5(a,b,c,d,e) (((a)+(b)+(c)+(d)+ (e))/5)
#define 标识符 字符序列 其中,标识符称作宏名,一般用大写字母。例如:
#define PI 3.1415926
对于像PI这样的宏在进行使用和处理时分为3个步 骤:① 在函数之外(往往在程序开头)使用#define控制 行定义宏名;② 在程序中使用已定义的宏名;③ 在程 序进行编译时,由预处理程序对宏名进行宏替换,恢 复被宏名所代替的字符序列的原貌。例如:
又如:
#define PI 3.l4l5q /* 有错:4的前面是字母l,5的后面是字母q */
… area = PI * r * r;
… 照样进行宏替换:
… area = 3.l4l5q * r * r;
… 为了避免出现上述第一种情况造成的误解,应当 把字符序列用括号括起来。
#define A (3+2)
⑧ 如果宏名出现在#号之后,则不对它进行替换。 例如:
#define DEF define
#DEF N 10 ⑨ 宏名的有效范围是从定义它的地方开始到其所 在文件末尾或者用 #undef指令消除该宏定义为止。宏 名不受分程序结构的影响,在其有效范围内遵循宏替 换的规则。
10.1.2 带参数的宏定义 1.带参数宏定义的一般格式 带参数的宏定义的一般形式是:
⑥ 如果宏定义中的字符序列过长,在一行中放不 下,可在该行末尾加续行符“\”,后随一个换行符。
#define LONG_STRING this is a very long string that is used as \ ↙
an example ⑦ 可以用宏定义来表示数据类型。
#define MAX 100 #define ENTRY struct entrytype 在程序中可用ENTRY定义变量: ENTRY table[MAX],* p;
相关文档
最新文档