#define
読み:シャープ-ディファイン
外語:#define

 C/C++などのプリプロセッサーディレクティブの一つで、文字の置き換え機能やプリプロセッサーマクロを定義するもの。
目次

構文
 #define 記号定数名 値
 #define マクロ名(引数) 定義

特徴

機構
 行末にセミコロンは必要ない。
 この文は、実際のコンパイル作業の前のプリプロセスにおいて処理され、定義どおりに置換してコンパイル作業に入る。
 単なる置換処理という都合から、定義方法に一定の工夫が必要になることもある。具体的には、定義内容が式などの場合は全体を括弧でくくる必要がある、などがある。

定数定義
 定数を使う場合、即値でプログラム中に書いてしまうと後からの訂正が困難である。そこで別名定義が、処理系で多数用意される。この定義をするために使われるのが、#define文である。
 C++の場合、「型」の情報を重視するため、#define文ではなくconstでの定義が望ましい。

プリプロセッサーマクロ
 プリプロセッサーマクロ(以下、関数マクロ)は、あたかも関数のように見える、処理のまとまりを定義する。これも、実際には単なる置き換えに過ぎない。
 例えば、二つの値のうち小さい方を選択するマクロは、次の通り。
 #define MIN(a, b) ((a) < (b) ? (a) : (b))
 MIN(a, b)と書くと、「((a) < (b) ? (a) : (b))」に展開されることを意味する。
 関数マクロは、関数とは違い、引数などはそのままの形である。このため、展開後に意図せぬ計算順序になり、正しい結果が得られない可能性や、構文エラーを生じることもある。
 このため、関数マクロは引数や全体構造に丁寧に括弧を付け、計算順序を保護する必要がある。これは、これが関数ではなく、あくまで「単なる置き換え」に過ぎないからである。
 C++では可能な限り利用を避け、インライン関数またはテンプレートを使うことが望ましい。

再検索