(持续更新中!!~)24、原来可以这样理解C语言_预处理详解(3/13)预定义符号

目录

 3. #define定义宏


 3. #define定义宏

        #define 机制包括了⼀个规定,允许把参数替换到⽂本中,这种实现通常称为宏(macro)或定义宏(define macro)。 下⾯是宏的申明⽅式:

#define name( parament-list ) stuff

        其中的 parament-list 是⼀个由逗号隔开的符号表,它们可能出现在stuff中。

注意:

        参数列表的左括号必须与name紧邻,如果两者之间有任何空⽩存在,参数列表就会被解释为stuff的⼀部分。

举例:

#define SQUARE( x ) x * x

        这个宏接收⼀个参数 x .如果在上述声明之后,你把 SQUARE( 5 ); 置于程序中,预处理器就会⽤下⾯这个表达式替换上⾯的表达式: 5 * 5

警告:

        这个宏存在⼀个问题:观察下⾯的代码段:

int a = 5;

printf("%d\n" ,SQUARE( a + 1) );

        乍⼀看,你可能觉得这段代码将打印36,事实上它将打印11,为什么呢?

        替换⽂本时,参数x被替换成a + 1,所以这条语句实际上变成了:

printf ("%d\n",a + 1 * a + 1 );

        这样就⽐较清晰了,由替换产⽣的表达式并没有按照预想的次序进⾏求值。

        在宏定义上加上两个括号,这个问题便轻松的解决了:

#define SQUARE(x) (x) * (x)

        这样预处理之后就产⽣了预期的效果:

printf ("%d\n",(a + 1) * (a + 1) );

        这⾥还有⼀个宏定义:

#define DOUBLE(x) (x) + (x)

        定义中我们使⽤了括号,想避免之前的问题,但是这个宏可能会出现新的错误。

int a = 5;

printf("%d\n" ,10 * DOUBLE(a));

        这将打印什么值呢?看上去,好像打印100,但事实上打印的是55.

         我们发现替换之后:

printf ("%d\n",10 * (5) + (5));

        乘法运算先于宏定义的加法,所以出现了 55 .

        这个问题,的解决办法是在宏定义表达式两边加上⼀对括号就可以了。

#define DOUBLE( x) ( ( x ) + ( x ) )

提⽰:

        所以⽤于对数值表达式进⾏求值的宏定义都应该⽤这种⽅式加上括号,避免在使⽤宏时由于参数中的操作符或邻近操作符之间不可预料的相互作⽤。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值