パラメータつきのマクロ

スポンサーリンク
スポンサーリンク
ライフスタイル関連のコンテンツ
お金 | 仕事 | 勉強 | プライベート | 健康 |
プログラミング関連のコンテンツ
C言語/C++入門 | Ruby入門 | Python入門 | プログラミング全般

パラメータつきのマクロ定義

スポンサーリンク

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

に展開されます。

スポンサーリンク
 
スポンサーリンク