- # C言語/C++入門 > C++プリプロセッサ
パラメータつきのマクロ
スポンサーリンク
スポンサーリンク
ライフスタイル関連のコンテンツ
お金 | 仕事 | 勉強 | プライベート | 健康 | 心
プログラミング関連のコンテンツ
C言語/C++入門 | Ruby入門 | Python入門 | プログラミング全般
お金 | 仕事 | 勉強 | プライベート | 健康 | 心
プログラミング関連のコンテンツ
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"
に展開されます。
スポンサーリンク
>> 次の記事 : スタックの実装・構造体で表現
<< 前の記事 : #inlude/ヘッダファイル(インクルードファイル)
- - 関連記事 -
- スタックの実装・構造体で表現
- #inlude/ヘッダファイル(インクルードファイル)
- #ifdef #endif #undef #ifndef/条件付きコンパイル
- #define/定数定義・マクロ
- プリプロセッサの働き
スポンサーリンク