2011/12/03

[無駄話]マクロをdo-whileで囲むか否か

続けて無駄話だ。
今、仕事でマクロをばしばし使っている。
inline関数はないし、関数呼び出しするといろいろとオーバーヘッドがかさむからだ。
直に書いてもいいけど、メンテナンスを考えるとマクロでやるか、という状況だと思っておくれ。

さて、関数マクロの場合、私はdo-whileで囲むことが多い。
#define MACRO_FUNC(x,y) \
do { \
 y = (x) * (x); \
} while(0)
習慣みたいなものだが、静的解析ツールにかけると「while内が固定なので変だ」みたいな警告が出てくる。
うーん、この書き方は市民権を得ていないのか・・・。
do-whileなしでも、括弧だけで十分という気もする。
薄れた記憶からすると、括弧だけでは対処できないパターンがあるのでこの文法が使われていたと思う。
なんだっけ・・・。最適化が絡んでいたような。
Google検索
ああ、if文で途切れるのね。
if(xxx)
 MACRO_FUNC(x,y);
else
 //to do
で、MACRO_FUNCが{}だけだと、
if(xxx)
 {
  y = x * x;
 };
else
 //to do
となり、
if(xxx) {
 y = x * x;
}
;
else
 // to do
となってしまい、elseが浮いてしまうのだ。
でもまあ、コーディング規約で「必ず括弧で囲め」とやってるから、別にいいんだけどね。
コンパイルエラーになるから、動作がおかしい、ということにはならないし。

0 件のコメント:

コメントを投稿

コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。

注: コメントを投稿できるのは、このブログのメンバーだけです。