11.3 書寫多語句宏的最好方法是什麼?

通常的目標是書寫一個象包含一個單獨的函數調用語句的宏。這意味著  ``調用者" 需要提供最終的分號, 而宏體則不需要。因此宏體不能為簡單 的括弧包圍的復合語句, 因為如果這樣, 調用的時候就會發生語法錯 (明顯是 一個單獨語句, 但卻多了一個額外的分號), 就像在 if/else 語句的 if 分支 中多了一個 else 分句一樣。

所以, 傳統的結局方案就是這樣使用:

	#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)