宏的本质以及宏(包括函数式宏) 没有返回值概念

宏(包括函数式宏)  没有返回值的概念,函数才有返回值的概念

函数才有返回值的概念,因为调用函数时有一个切换并保护现场的过程,所以切换回来(到调用者)时就需要通过返回值将函数的结果传送回来。

宏(包括函数式宏)  没有返回值的概念,因为它只是在源代码文件(级别)上的文本替换(即修改些源代码),没有一个切换并保护现场的过程,所以不需要也不存在一个通过返回值将其的结果传送回来的过程。还有,宏所代表的表达式的计算结果是叫一个结果值,不叫(函数)返回值。



1、#define xxx() {} ,是标准C支持的
也是GCC新增的功能(微软vS不支持),主要为了防止宏展开出现问题,默认展开时是要加上一个;的(即{;}),(否则)容易出问题。

2、表达式是操作符、变量、常量的任意组合。在C语言中,花括号{}和分号;(分号表达式语句(结束的)分隔符,不算运算符。)不是操作符,而圆括号()和逗号,(属于顺序点运算符)是操作符(即运算符)。而上述d={a=1;b+=1;c=3;a+b+c;}这个整体表达式(即一个赋值表达式)中{a=1;b+=1;c=3;a+b+c;}可以作为其子表达式,有点费解。上述语句里,花括号{}和分号;相当于圆括号()和逗号,的作用。

3、整体表达式

<子表达式><子表达式>;<子表达式><子表达式>;<子表达式><子表达式>;

 

表达式分隔符,比表达式分隔符;优先级高

 

4、头文件的内容除了函数原型和宏定义外,还可以有结构体定义,全局变量定义


-----------------------------------------------------我是分割线-----------------------------------------


1.函数体直接使用宏定义不管有没有返回值都不能作赋值运行的左右值 . 如下图示:


错误提示:

 



2.通过使用小括号()把函数体括起来使用宏定义可以得到该函数体最后一条语句运算结果,这里还需要注意 ,不能漏了' ; ',

如下图示:


打印结果如下:

 

 

3.一般情况下使用多语句宏定义时 ,最好使用do{...}while(0)或者({})的形式

        因为在if() 结构里做分支执行部分时,使用do{...}while(0)可以使调用时后面能正确的使用' ; ' ,一旦没写就会像普通语句那样报错 , 这样符合我们的习惯 ,  如果只是使用{}的结构体形式 , 那么在调用时后面不能使用' ; ' , 如果按照我们的习惯写上 ' ; '  ,那么就有可能引起错误 . 比如 : if()后面还有else语句的话, 就会出错 , 因为 ' ; '被当作另外一条语句(空指令)的结束符插在else的上面 .

注意  使用do{...}while(0)结构之后就不能把这个把这个宏定义作为赋值操作的左右值了.

图示如下:

 

打印结果对应如下:

 

 

4.需要得到函数式宏定义的返回值的方法

         从上面我们已经可以知道当我们使用({})形式的宏定义时 , 只要函数体最后一次运算出的结果是我们想要的那使用这个形式是可以正确取得返回值的 并且放在赋值操作的右端;  当我们使用do{...}while(0)形式的宏定义时 , 我们是无法通过赋值操作来得到返回值的 , 但是我们可以通过多加一个参数 , do{}while(0)里面把要放回的值赋给多加的这个参数 , 这样我们就可以得到想要的返回值了.

演示图示如下:

 

打印结果如下:




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值