宏定义的技巧 1、函数体直接使用宏定义不管有没有返回都不能作赋运算的左右 . 如下图示: 错误提示: 2、通过 使用小括号() 把函数体括起来使用宏定义可以得到该函数体最后一条语句运算结果,这里还需要注意 ,不能漏了' ; ' ,如下图示: 打印结果如下: 3、一般情
宏定义的技巧
1、函数体直接使用宏定义不管有没有返回值都不能作赋值运算的左右值 . 如下图示:
错误提示:
2、通过使用小括号()把函数体括起来使用宏定义可以得到该函数体最后一条语句运算结果,这里还需要注意 ,不能漏了' ; ',如下图示:
打印结果如下:
3、一般情况下使用多语句宏定义时 ,最好使用do{...}while(0)或者({})的形式
因为在if() 结构里做分支执行部分时,使用do{...}while(0)可以使调用时后面能正确的使用' ; ' ,一旦没写就会像普通语句那样报错 , 这样符合我们的习惯 , 如果只是使用{}的结构体形式 , 那么在调用时后面不能使用' ; ' , 如果按照我们的习惯写上 ' ; ' ,那么就有可能引起错误 . 比如 : if()后面还有else语句的话, 就会出错 , 因为 ' ; '被当作另外一条语句(空指令)的结束符插在else的上面 .
注意 : 使用do{...}while(0)结构之后就不能把这个把这个宏定义作为赋值操作的左右值了.
图示如下:
打印结果对应如下:
4、需要得到函数式宏定义的返回值的方法
从上面我们已经可以知道当我们使用({})形式的宏定义时 , 只要函数体最后一次运算出的结果是我们想要的那使用这个形式是可以正确取得返回值的 并且放在赋值操作的右端; 当我们使用do{...}while(0)形式的宏定义时 , 我们是无法通过赋值操作来得到返回值的 , 但是我们可以通过多加一个参数 , do{}while(0)里面把要放回的值赋给多加的这个参数 , 这样我们就可以得到想要的返回值了.
演示图示如下:
打印结果如下:
使用do-while(0)定义宏函数的优点
宏函数与内联函数的比较
先来看下C++ 的“函数内联”的工作机制。对于任何内联函数,编译器在符号表里放入函数的声明(包括名字、参数类型、返回值类型)。如果编译器没有发现内联函数存在错误,那么该函数的代码也被放入符号表里。在调用一个内联函数时,编译器首先检查调用是否正确(进行类型安全检查,或者进行自动类型转换,当然对所有的函数都一样)。如果正确,内联函数的代码就会直接替换函数调用,于是省去了函数调用的开销。这个过程与预处理有显著的不同,因为预处理器不能进行类型安全检查,或者进行自动类型转换。假如内联函数是成员函数,对象的地址(this)会被放在合适的地方,这也是预处理器办不到的。
注意:
相关博文:http://www.2cto.com/kf/201212/174236.html
http://blog.csdn.net/gao675597253/article/details/7397373