宏定义函数

概念

在预编译阶段完成代码替换。

优势

(1)增加代码的可读性:

宏定义的优点很多,但我个人理解宏定义最明显的优点就是增加代码的可读性。求圆的面积, 用“PI * r* r”比 “3.14r”的可读性就强很多了。

#define PI 3.14

float circleArea(float r) {
  return PI * r * r;
}
(2)自带“模版函数”的buff:

宏定义函数的参数没有数据类型,因此可轻松实现模板函数的功能

#define MAX(a, b) (a > b ? a : b)

std::cout << "max of a and b is: " << MAX(1, 2)  << std::endl;
std::cout << "max of a and b is: " << MAX(1.5, 2.1) << std::endl;
(3)相比于正常函数,宏定义函数性能更快

宏定义的本质决定了这个优势,宏定义只是在代码编译阶段做一个简单的替换,没有任何语法和优化的空间,因此宏定义函数没有正常函数所需的开销,包括:开辟空间,记录返回地址,形参压栈,从函数中返回释放堆栈。

缺点#define SUM(a,b) a+b
  • 1 宏定义函数只能完成一些简单的替换,因此他的使用场景是有限制的,即使是宏定义函数, 也只是完成简单的功能, 不能真正的替代函数。
  • 2 由于只是做一个替换,因此使用的时候需要谨慎,避免出现符号优先级而出现的低级错误。
#define SUM(a,b) a+b
std::cout << "area of rectangle: " << 2 * SUM(1, 2) << std::endl;
// 打印的结果是4, 而不是6.因此替换后的代码:
2 * 1 + 2, 而不是2 *1+ 2

一个惯用的用法

用do{}while(0)包裹宏定义函数中的代码,这样的好处就是方便实现很复杂的宏定义函数,还可以把这个宏定义函数伪装成一个正常的函数去执行。
如下例:

#define UNIT_AREA(shape)               \
  do {                                 \
    if (shape == "circle") {           \
      std::cout << PI << std::endl;    \
    } else if ( shape == "square") {   \
      std::cout << "1" << std::endl;   \
    } else {                           \
      std::cout << "1.0" << std::endl; \
    }                                  \
  } while(0)
 
 std::cout << "area of unit area: " << std::endl;
 UNIT_AREA("circle");

宏定义函数中的特殊符号

(1) …和__VA__ARGS__

支持宏定义就函数中的可变参数,宏定义参数可变,或者部分参数可变。
使用“…”配合“VA_ARGS”。

#define  LOG(...) {printf("%s\n", __VA_ARGS__);}
#define  ERROR_LOG(x, ...) if (x) {printf("%s\n", __VA_ARGS__);}

// 以下代码皆可执行
 LOG("this is log")
 LOG("this is log");
 ERROR_LOG(1, "this is error log");
 {printf("log");}
 {printf("log");};
连接符:##

待写

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值