- 0
- 0
- 约1.81千字
- 约 28页
- 2019-12-01 发布于天津
- 举报
;;; 基本概念;9.1 宏定义; 9.1 宏定义; 8.1 宏定义; 8.1 宏定义;(4)宏名如果在源程序中若用引号括起来,则预处理程序不对其作宏替换。P206例9.2中的L;(6)习惯上宏名用大写字母表示,以便于与变量区别。但也允许用小写字母。
(7)可用宏定义表示数据类型,使书写方便。
例如: #define INT int
在程序中可用INT作变量说明:
INT a[10], body[5];
(8)如果对输出格式进行宏定义,可以减少程序中重复书写某些字符串的工作量,而对程序结果没有影响。使用宏定义,还可以提高程序的通用性。;例: 对输出格式进行宏定义。
#define PR printf
#define D %d
#define F %f\n
#include stdio.h
void main()
{ int a=012, c=-8, e=11;
float b=3.8, d=9.7, f=21.08;
PR(D F,a,b);
PR(D F,c,d);
PR(D F,e,f);};例如:
#define N(x,y) 3*x+y*y /*带参的宏定义*/
k=N(7,9);
/*经预处理宏展开后的语句为:k= 3*7+9*9;*/;例: 带参的宏定义示例。
#include stdio.h
#define MAX(a,b) (ab)?a:b
void main()
{ int x,y,max;
printf(input two numbers:);
scanf(%d%d,x,y);
max=MAX(x,y);
printf(max=%d\n,max);};2. 使用带参宏定义的几点说明
对于带参的宏定义有以下问题需要说明:
(1)带参宏定义中,宏名和形参表之间不能有空格出现。
例如: #define MAX(a,b) (ab)?a:b
写为:#define MAX (a,b) (ab)?a:b;例: 带参的宏定义中形参和实参的替换。
#include stdio.h
#define S1(y) (y)*(y)
void main()
{ int a,sq;
printf(input a number: );
scanf(%d,a);
sq=S1(a+1);
printf(sq=%d\n,sq); }
; 8.1 宏定义;;3. 带参宏定义与函数的区别
(1) 函数调用时,先求出实参表达式的值,然后代入形参。而使用带参的宏只是进行简单的字符替换。
(2) 函数调用是在程序运行时处理的,为形参分配临时的内存单元。而宏展开则是在编译前进行的,在展开时并不分配内存单元,不进行值的传递处理,也没有“返回值”的概念。
(3) 对函数中的实参和形参类型要求一致。而宏名无类型,它的参数也无类型,只是一个符号代表,展开时代入指定的字符串即可。宏定义时,字符串可以是任何类型的数据。
(4) 调用函数只可得???一个返回值,而用宏可以设法得到几个结果。(例9.4 ); 说明: 如果善于利用宏定义,可以实现程序的简化,如事先将程序中的“输出格式”定义好,以减少在输出语句中每次都要写出具体的输出格式的麻烦。;9.2 文件包含;9.2 文件包含;9.2 文件包含;9.2 文件包含;概念:所谓“条件编译”,是对部分内容指定编译的条件,使其只在满足一定条件才进行编译。; 9.3 条件编译 ;例: 条件编译#if的使用。
#include stdio.h
#define PI 3.14159
#define R 1
void main()
{ float c,r,s;
printf (input a number: );
scanf(%f,c);
#if R
r=PI*c*c;
printf(area of round is %f\n,r);
#else
s=c*c;
printf(area of square is %f\n,s);
#endif
};THE END
原创力文档

文档评论(0)