宏函数

使用宏函数的优点有两个

  1. 适用于任何实现了operator<的类型,包括自定义类型;
  2. 效率最高。虽然使用inline提示符也将函数或模板定义为内联的,但这只是一种提示而已,到底编译器有没有优化还依赖于编译器的实现,而使用宏函数则是完全由代码本身控制。

宏函数是包括在do{…}while(0)内的原因

考虑下面一个特殊的例子。 
宏函数的定义如下:

#define test(x) \
  a(x); \
  b(x);
如果在调用时是这样调用的:

if (judge)
  test(x);

那么展开之后就是:

if (judge):
  a(x);
b(x);

这时产生的效果可能就和你的本意不同了,因为b(x)无论怎样都会执行。

这是由于大括号产生的问题,那如果我们简单的给宏函数加上大括号而不用do{…}while(0)可以吗? 
举例如下:

#define test(x)\
{ \
  a(x);\
  b(x);\
}

调用时:

if (judge)
  test(x);

展开之后:

if (judge)
{
  a(x);
  b(x);
};

这个时候就产生语法错误了,因为多了一个分号。

总结:宏函数加do{…}while(0)其实并不是额外加了什么功能,只是为了保持宏函数实现的时候语意和我们所写的代码一致,防止大括号以及分号的干扰
 

posted @ 2019-07-08 14:34  車輪の唄  阅读(25)  评论(0编辑  收藏  举报  来源