所以, 传统的结局方案就是这样使用:
#define MACRO(arg1, arg2) do { \ /* declarations */ \ stmt1; \ stmt2; \ /* ... */ \ } while(0) /* 没有结尾的 ; */
当调用者加上分号后, 宏在任何情况下都会扩展为一个单独的语句。 优化的 编译器会去掉条件为 0 的 ``无效" 测试或分支, 尽管 lint 可能会警告。
如果宏体内的语句都是简单语句, 没有声明或循环, 那么还有一种技术, 就是写一个单独的, 用一个或多个逗号操作符分隔的表达式。 例如, 问题 10.22 的第一个 DEBUG() 宏。这种技术还可以 ``返回" 一个值。
参考资料: [H&S, Sec. 3.3.2 p. 45]; [CT&P, Sec. 6.3 pp. 82-3]。
翻译朱群英、孙云, LaTeX2HTML 编译 朱群英 (2005-06-23)