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

用語の所属
プリプロセッサーディレクティブ
関連する用語
typedef
using

コメントなどを投稿するフォームは、日本語対応時のみ表示されます


KisoDic通信用語の基礎知識検索システム WDIC Explorer Version 7.04a (27-May-2022)
Search System : Copyright © Mirai corporation
Dictionary : Copyright © WDIC Creators club