、宏(包括函数式宏) 没有返回值的概念,函数才有返回值的概念
函数才有返回值的概念,因为调用函数时有一个切换并保护现场的过程,所以切换回来(到调用者)时就需要通过返回值将函数的结果传送回来。
宏(包括函数式宏) 没有返回值的概念,因为它只是在源代码文件(级别)上的文本替换(即修改些源代码),没有一个切换并保护现场的过程,所以不需要也不存在一个通过返回值将其的结果传送回来的过程。还有,宏所代表的表达式的计算结果是叫一个结果值,不叫(函数)返回值。
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)或者({})的形式
do{...}while(0)可以使调用时后面能正确的使用' ; ' ,一旦没写就会像普通语句那样报错 , 这样符合我们的习惯 , 如果只是使用{}的结构体形式 , 那么在调用时后面不能使用' ; ' , 如果按照我们的习惯写上 ' ; ' ,那么就有可能引起错误 . 比如 : if()后面还有else语句的话, 就会出错 , 因为 ' ; '被当作另外一条语句(空指令)的结束符插在else的上面 .
注意 : 使用do{...}while(0)结构之后就不能把这个把这个宏定义作为赋值操作的左右值了.
图示如下:
打印结果对应如下:
4.需要得到函数式宏定义的返回值的方法
使用({})形式的宏定义时 , 只要函数体最后一次运算出的结果是我们想要的那使用这个形式是可以正确取得返回值的 并且放在赋值操作的右端; 当我们使用do{...}while(0)形式的宏定义时 , 我们是无法通过赋值操作来得到返回值的 , 但是我们可以通过多加一个参数
演示图示如下:
打印结果如下: