ア | イ | ウ | エ | オ |
カ | キ | ク | ケ | コ |
サ | シ | ス | セ | ソ |
タ | チ | ツ | テ | ト |
ナ | ニ | ヌ | ネ | ノ |
ハ | ヒ | フ | ヘ | ホ |
マ | ミ | ム | メ | モ |
ヤ | ユ | ヨ | ||
ラ | リ | ル | レ | ロ |
ワ | ヰ | ヴ | ヱ | ヲ |
ン |
A | B | C | D | E |
F | G | H | I | J |
K | L | M | N | O |
P | Q | R | S | T |
U | V | W | X | Y |
Z | 数字 | 記号 |
C/C++などのプリプロセッサーディレクティブの一つで、文字の置き換え機能やプリプロセッサーマクロを定義するもの。
#define 記号定数名 値
#define マクロ名(引数) 定義
行末にセミコロンは必要ない。
この文は、実際のコンパイル作業の前のプリプロセスにおいて処理され、定義どおりに置換してコンパイル作業に入る。
単なる置換処理という都合から、定義方法に一定の工夫が必要になることもある。具体的には、定義内容が式などの場合は全体を括弧でくくる必要がある、などがある。
定数を使う場合、即値でプログラム中に書いてしまうと後からの訂正が困難である。そこで別名定義が、処理系で多数用意される。この定義をするために使われるのが、#define文である。
C++の場合、「型」の情報を重視するため、#define文ではなくconstでの定義が望ましい。
プリプロセッサーマクロ(以下、関数マクロ)は、あたかも関数のように見える、処理のまとまりを定義する。これも、実際には単なる置き換えに過ぎない。
例えば、二つの値のうち小さい方を選択するマクロは、次の通り。
#define MIN(a, b) ((a) < (b) ? (a) : (b))
MIN(a, b)と書くと、「((a) < (b) ? (a) : (b))」に展開されることを意味する。
関数マクロは、関数とは違い、引数などはそのままの形である。このため、展開後に意図せぬ計算順序になり、正しい結果が得られない可能性や、構文エラーを生じることもある。
このため、関数マクロは引数や全体構造に丁寧に括弧を付け、計算順序を保護する必要がある。これは、これが関数ではなく、あくまで「単なる置き換え」に過ぎないからである。
C++では可能な限り利用を避け、インライン関数またはテンプレートを使うことが望ましい。
コメントなどを投稿するフォームは、日本語対応時のみ表示されます