二级C语言考试辅导教程第九章:预处理[2]

二级C语言考试辅导教程第九章:预处理[2],第1张

二级C语言考试辅导教程第九章:预处理[2],第2张

7.可以用宏定义来表示数据类型,方便编写。比如:#define STU struct STU在程序中可以作为变量描述:STU body带参数的宏定义的一般形式是:#define宏名(参数表)字符串包含字符串中的每个参数。带参数的宏调用的一般形式是:宏名(参数表);
例如:
#define M(y) y*y+3*y /*宏定义*/
:
k = M(5);/*宏调用*/
:调用宏时,参数Y被参数5替换。预处理宏展开的语句
为:k = 5 * 5+3 * 5
# definemax (a,b) (a > b)?a:b
main(){
int x,y,max
printf("输入两个数:");
scanf("%d%d ",&x,& y);
max=MAX(x,y);
printf("max=%d\n ",max);
}
上面示例程序的第一行是用宏定义的,用宏名MAX来表示条件表达式(a>b)?A:b,形参A和B都出现在条件表达式中。程序第七行max=MAX(x,
y)是一个宏调用,实参x,y将代替参数a,b,宏展开后语句为:max=(x>y)?x:y;用于计算x,y中的大数,关于带参数的宏定义,需要解释以下问题:,* p;#define INTEGER int可以在程序中作为整数变量使用说明:INTEGER a,b;要注意用宏定义表示数据类型和用typedef定义数据描述符的区别。宏定义只是简单的字符串替换,在预处理中完成,而typedef是在编译时处理的。它不是简单的替换,而是重命名类型说明符。命名标识符具有类型定义描述的功能。请看下面的例子:# define pin 1 int * typedef(int *)pin 2;它们在形式上相似,但在实际使用中不同。你用PIN1和PIN2来解释,就能看出以下变量的区别:PIN1 a,b;宏替换后变成int *a,b;a是一个指向整数的指针变量,而B是一个整数变量。然而:PIN2 a,b;a和b是指向整数的指针变量。因为PIN2是类型说明符。从这个例子可以看出,虽然宏定义也可以表示数据类型,但毕竟是用于字符
替换的。使用时要格外小心,以免出错。
8。“输出格式”的宏定义可以减少书写的麻烦。例9.3采用了这种方法。
# define P printf
# define D " % D \ n "
# define F " % F \ n "
main(){
int a = 5,c=8,e = 11
float b=3.8,d=9.7,f = 21.08P(D F,a,b);
P(D F,c,D);
P(D F,e,F);
}

使用宏定义

c语言允许宏有参数。宏定义中的参数叫形参,宏调用中的参数叫实参。用参数调用宏时,不仅要扩展宏,还要用实参代替参数。资料来源:www.examda.com

[5]

1.在带参数的宏定义中,宏名和参数表之间不能有空大小写。
比如放:#define MAX(a,b) (a>b)?A:b写成:#define MAX (a,b) (a>b)?A:b会被认为是无参数宏的定义,宏名MAX表示字符串(a,b)(a>b)?甲:乙.
扩展宏时,宏调用语句:max=MAX(x,y);会变成:max=(a,b)(a>b)?a:b(x,y);这显然是错误的。

2.在带参数的宏定义中,形参不分配内存单元,所以不需要定义类型。宏调用中的参数有特定的值。要用它们代替形参,有必要做一个类型描述。这与函数中的情况不同。在函数中,形参和实参是两个不同的量,各有自己的作用域。调用时,应将参数值赋给参数,并传递该值。但是在带参数的宏中,只有符号替换,不存在值传递的问题。

3.宏定义中的参数是标识符,而宏调用中的实参可以是表达式。
# define SQ(y)(y)*(y)
main(){
int a,SQ;
printf("输入一个数字:");
scanf("%d ",& a);
SQ = SQ(a+1);
printf("sq=%d\n ",sq);
}

位律师回复
DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
白度搜_经验知识百科全书 » 二级C语言考试辅导教程第九章:预处理[2]

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情