パラメータつきのマクロ定義
#define を用いたマクロには、パラメータを渡すことができます。
#define SQR(n) ((n) * (n))
上記のマクロは、数値を2乗するマクロです。
マクロのパラメータは、必ず( )で囲むことに注意です。
でなければ、意図しない結果となってしまう場合があります。
#include <iostream>
#define SQR(n) (n * n)
int main() {
int count;
for (count = 0; count < 5; count++) {
std::cout << "n: " << (count + 1) << " n squared: " << SQR(count + 1) << "\n";
}
return 0;
}
上記コードは、以下のような出力を期待して書いたものです。
n: 1 n squared: 1 n: 2 n squared: 4 n: 3 n squared: 9 n: 4 n squared: 16 n: 5 n squared: 25
しかし、実際には実行結果は、次のようになります。
n: 1 n squared: 1 n: 2 n squared: 3 n: 3 n squared: 5 n: 4 n squared: 7 n: 5 n squared: 9
この予期しない動作は、「SQR(count + 1)」のマクロ部分の展開を考えると、理解できます。
「SQR(count + 1)」は、マクロ展開されると、「(count + 1 * count + 1)」となります。
forループの中で、たとえばcountの値が2であった場合・・・
「(2 + 1 * 2 +1)」の計算結果、すなわち「5」が出力されるということになります。
マクロのパラメータは、必ず( )で囲むというルールに従い、次のようにコードを書き換えると・・・
#include <iostream>
#define SQR(n) ((n) * (n))
int main() {
int count;
for (count = 0; count < 5; count++) {
std::cout << "n: " << (count + 1) << " n squared: " << SQR(count + 1) << "\n";
}
return 0;
}
今度は、以下のように、意図した動作を得られます。
n: 1 n squared: 1 n: 2 n squared: 4 n: 3 n squared: 9 n: 4 n squared: 16 n: 5 n squared: 25
#演算子
#演算子を、パラメータを持つマクロの定義で用いると、引数を文字列に変換します。
#define STRING(str) #str STR(hello)
上記コードは・・・
"hello"
に展開されます。
■この記事のトラックバックURL:
http://www.mapee.jp/mpe334/mt-tb.cgi/218