函数式宏定义和真正的函数相比有很多缺点,但只要小心使用还是会显著提高代码的执行效率,毕竟省去了分配和释放栈帧、传参、传返回值等一系列工作,因此那些简短并且被频繁调用的函数经常用函数式宏定义来代替实现。
在asterisk源码中就有很多这样的例子:
如:
#define CLEANUP(ast, p) do { \
int x; \
if (p->chan) { \
if (x != AST_TIMING_FD) \
ast->fds[x] = p->chan->fds[x]; \
} \
ast->fds[AST_AGENT_FD] = p->chan->fds[AST_TIMING_FD]; \
} \
} while(0)
由于宏定义末尾不能加分号,因此这里均采用do while的形式,只执行第一次,有点技巧。
阅读(1685) | 评论(0) | 转发(0) |