- # C言語/C++入門 > C++プリプロセッサ
#define/定数定義・マクロ
お金 | 仕事 | 勉強 | プライベート | 健康 | 心
プログラミング関連のコンテンツ
C言語/C++入門 | Ruby入門 | Python入門 | プログラミング全般
定数定義
定数を定義するには、#define文を利用します。
PHPでも、同じ名前のdefine関数で定数定義できますが、このC/C++の#defineに由来しているのですね。
C/C++を勉強するようになって以来、PHPをより理解できるようになった気がしますので、基本だけでもC/C++を勉強すると良いように思います。
#define のほか、const宣言を使っても定数を定義できます。
#define ARRAY_SIZE 10 // 配列のサイズ10 const int ARRAY_SIZE 10; // 配列のサイズ10
上記コードは、どちらも同じ意味です。
プリプロセッサコマンドを書く場合には、先頭にハッシュマーク(#)をつけます。
行の1文字目が、「#」でなければなりません。
プリプロセッサへの命令は、#ではじまり、EOL(End of Line:行末を表す)で終了します。
C++のように、「;」(セミコロン)ではなく、EOLであることに注意です。
また、プリプロセッサの命令を次行に折り返すには、行端に「\」(バックスラッシュ)をつけます。
置換マクロ
プリプロセッサの用途で多いのは、置換マクロの定義です。
#define <マクロ名(大文字)> <置換テキスト> #define FOO bar
プログラミングの慣習として、マクロ名は大文字で書くのが一般的です。
これにより、マクロ(大文字)と変数(小文字)を区別しやすくなります。
<置換テキスト>には、スペース、演算子、それ以外の文字を利用でき、たとえばC++コードを書くこともできます。
ただし、プリプロセッサは、C++構文の妥当性を検証しないため、問題を引き起こす場合もあります。
コードが読みにくくもなりますので、プログラムの基本的な制御(for文やif文)などを、マクロに定義するのは、避けたほうが良いようです。
#include <iostream> #define FIRST 8 #define LAST 5 #define SUM FIRST + LAST int main() { std::cout << "Square: " << SUM * SUM << "\n"; return 0; }
上記の出力結果は、どうなるでしょうか?
8+5の結果を掛け合わせ、13×13、すなわち「Square: 169」を期待したコードだったはずですが、出力結果は・・・
Square: 53
となります。
これは、「SUM * SUM」のマクロ部分を展開すると、「8 + 5 * 8 + 5」となり、この演算の結果は、掛け算が足し算より優先されますから、「Square: 53」となります。
こういった失敗を防ぐには、マクロ定義の部分で、式を用いる場合は、「( )」(括弧)で囲むと間違いがありません。
#define FIRST 8 #define LAST 5 #define SUM (FIRST + LAST)
としてやれば、予想通りの「Square: 169」という出力が得られます。
- - 関連記事 -
- スタックの実装・構造体で表現
- パラメータつきのマクロ
- #inlude/ヘッダファイル(インクルードファイル)
- #ifdef #endif #undef #ifndef/条件付きコンパイル
- プリプロセッサの働き