#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」という出力が得られます。

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