10.2 书写多语句宏的最好方法是什么?

通常的目标是书写一个象包含一个单独的函数调用语句的宏。

这意味着“调用者”需要提供最终的分号, 而宏体则不需要。

因此宏体不能为简单的括弧包围的复合语句, 因为如果这样, 调用的时候就会发生语法错(明显是一个单独语句, 但却多了一个额外的分号), 就像在if/else 语句的if 分支中多了一个else 分句一样。

所以, 传统的结局方案就是这样使用:

#define MACRO(arg1, arg2) do { \

/* declarations */ \

stmt1; \

stmt2; \

/* ... */ \

} while(0) /* 没有结尾的; */

当调用者加上分号后, 宏在任何情况下都会扩展为一个单独的语句。

优化的编译器会去掉条件为0 的“无效” 测试或分支, 尽管lint 可能会警告。

如果宏体内的语句都是简单语句, 没有声明或循环, 那么还有一种技术, 就是写一个单独的, 用一个或多个逗号操作符分隔的表达式。

例如, 问题10.22 的第一个DEBUG() 宏。

这种技术还可以“返回” 一个值。

永不止步步 发表于01-16 14:47 浏览65535次
分享到:

已有0条评论

暂时还没有回复哟,快来抢沙发吧

添加一条新评论

只有登录用户才能评论,请先登录注册哦!

话题作者

永不止步步
金币:67417个|学分:363741个
立即注册
畅学电子网,带你进入电子开发学习世界
专业电子工程技术学习交流社区,加入畅学一起充电加油吧!

x

畅学电子网订阅号