#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++では可能な限り利用を避け、インライン関数または
テンプレート
を使うことが望ましい。
再検索