「More C++ Idioms/複文マクロ(Multi-statement Macro)」の版間の差分
削除された内容 追加された内容
現内容を翻訳 |
|||
1 行
=<center>複文マクロ(Multi-statement Macro)</center>=
===
複文(複数行)のマクロを書く。
===
===
2つ以上の分をまとめて1つのマクロにして、関数呼び出しのように呼び出すことが便利な場合がある。
大抵 inline 関数が第一候補となるはずだが、デバッグ用途のようなものだとほとんど常に関数呼び出しよりもマクロになってしまう。
素朴な方法で、複数の文を 1 つのマクロにまとめた場合、ぱっと見では明らかではないコンパイルエラーを引き起こす場合がある。例えば、
<source lang="cpp">
12 ⟶ 14行目:
</source>
のようなマクロは、セミコロンが終端に付けられている場合、if 文のところでコンパイルエラーになる。
<source lang="cpp">
if (cond)
MACRO(10,20); //
else
statement3;
</source>
上記の文は次のように展開され
<source lang="cpp">
if (cond)
{ statement1; statement2; }; //
else
statement3;
</source>
エラーが発生する。そのため、人々は、複文マクロに対して広く使われる、do-while ループを基本とするイディオムを考え出した。
===
以下に複文マクロ(Multi-statement Macro)イディオムの例を示す。
<source lang="cpp">
#define MACRO(arg1, arg2) do { \
/*
statement1; \
statement2; \
/* ... */ \
} while(0) /* (
</source>
呼び出し元でセミコロンを付け加えれば、この式は文脈に関わらず単一の文になる。
最適化コンパイラは大抵 while(0) のような無意味なテストを取り除く。
このイディオムはマクロが関数呼び出しのパラメータとして呼び出される時には役に立たない。
なお、このイディオムではマクロ中で return 文を用いることができる。
<source lang="cpp">
func(MACRO(10,20)); //
</source>
===
<source lang="cpp">
#define ACE_NEW_RETURN(POINTER,CONSTRUCTOR,RET_VAL) \
58 ⟶ 63行目:
</source>
===
=== References ===
* [http://c-faq.com/cpp/multistmt.html What's the best way to write a multi-statement macro?]
[[en:More C++ Idioms/Multi-statement Macro]]
[[Category:{{BASEPAGENAME}}|ふくふんまくろ]]
|