okuの日記: 複数行を含むマクロをどうやって書くべきか
C++ FAQ Lite の Miscellaneous technical issues に [39.5] What should be done with macros that have multiple lines? という質問があるのですが、
#define MYMACRO(a, b) \
if (true) { \
statement1; \
statement2; \
... \
statementN; \
} else
(void)0
に対して、
#define MYMACRO(a, b) \
do { \
statement1; \
statement2; \
... \
statementN; \
} while (false)
という伝統的なマクロの書き方は非効率なコードを吐くことがある、と主張しています。
少なくとも私の持っているコンパイラはどちらも同じバイナリを生成するし、両者が違うコードを吐く例って何なの?という疑問をずっと持っていたのですが、今日改めて C++ FAQ Lite を読み直して、
... some C++ compilers refuse to inline-expand any function that contains a loop, and since this looks like a loop, those compilers won't inline-expand any function that contains it.
... 一部の C++ コンパイラはループ中の関数の inline 展開を行わないのだが、このコードは一見ループに見えるため、このようなコンパイラは中に含む関数の inline 展開を行わないだろう。
という箇所があって納得しました。 まあ、よく読めということですね。
inline を持たない C90 なら do~while (0) の書き方でも差し支えないが、C99 や C++ では inline が無視されるかも知れないのでよくない、という意図だったようです。
複数行を含むマクロをどうやって書くべきか More ログイン