/D (プリプロセッサの定義)

ソース ファイルのプリプロセッサ シンボルを定義します。

構文

/D[ ]name[= | # [{ string | number }] ]
/D[ ]"name[= | # [{ string | number }] ]"

解説

このシンボルを #if または #ifdef と一緒に使用すると、ソース コードを条件付きでコンパイルできます。 シンボル定義は、コードで再定義されるまで、または #undef ディレクティブによってコードで未定義になるまで有効です。

/D には、ソース コード ファイルの先頭にある #define ディレクティブと同じ効果があります。 違いは、/D ではコマンド ラインで引用符が取り除かれ、#define ディレクティブではそれらが保持される点です。 /D とシンボルの間には空白を使用できます。 シンボルと等号の間、または等号と割り当てられた値の間に空白を使用することはできません。

既定では、シンボルに関連付けられる値は 1 です。 たとえば、/D name は、/D name=1 と同じです。 この記事の最後の例では、1 を出力するための TEST の定義が示されています。

/D name= を使用してコンパイルすると、シンボルの name には値が関連付けられません。 シンボルは引き続きコードの条件コンパイルに使用できますが、何も指定されていないものとして評価されます。 この例では、/DTEST= を使用してコンパイルすると、エラーが発生します。 この動作は、値を指定して、または値を指定せずに #define を使用する場合と似ています。

/D オプションでは、関数のようなマクロ定義はサポートされていません。 コマンド ラインで定義できない定義を挿入するには、/FI(強制インクルード ファイルの名前の指定) コンパイラ オプションを検討してください。

コマンド ラインで /D を複数回使用して、より多くのシンボルを定義できます。 同じシンボルが複数回定義されている場合は、最後の定義が使用されます。

次のコマンドを実行すると、TEST.c で DEBUG シンボルが定義されます。

CL /DDEBUG TEST.C

次のコマンドを実行すると、TEST.c からすべての __far キーワードが削除されます。

CL /D __far= TEST.C

CL 環境変数には、等号 (=) を含む文字列を設定できません。 CL 環境変数で /D を使用するには、等号ではなくシャープ記号 (#) を指定する必要があります。

SET CL=/DTEST#0

コマンド プロンプトでプリプロセッサ シンボルを定義する場合は、コンパイラ解析規則とシェル解析規則の両方を考慮してください。 たとえば、プログラムでパーセント記号のプリプロセッサ シンボル (%) を定義するには、コマンド プロンプトでパーセント記号 2 文字 (%%) を指定します。 1 つだけ指定すると、解析エラーが発生します。

CL /DTEST=%% TEST.C

Visual Studio 開発環境でこのコンパイラ オプションを設定するには

  1. プロジェクトの [プロパティ ページ] ダイアログ ボックスを開きます。 詳しくは、「Visual Studio で C++ コンパイラとビルド プロパティを設定する」をご覧ください。

  2. [構成プロパティ]>[C/C++]>[プリプロセッサ] プロパティ ページを選択します。

  3. [プリプロセッサの定義] プロパティのドロップダウン メニューを開き、[編集] を選択します。

  4. [プリプロセッサの定義] ダイアログ ボックスで、1 つ以上の定義を (1 行に 1 つ) 追加、変更、または削除します。 [OK] を選択して変更を保存します。

    ここで指定した定義に '/D' オプション プレフィックスを含める必要はありません。 プロパティ ページでは、定義はセミコロン (;) で区切ります。

このコンパイラ オプションをコードから設定するには

// cpp_D_compiler_option.cpp
// compile with: cl /EHsc /DTEST cpp_D_compiler_option.cpp
#include <stdio.h>

int main( )
{
#ifdef TEST
    printf_s("TEST defined %d\n", TEST);
#else
    printf_s("TEST not defined\n");
#endif
}
TEST defined 1

関連項目

MSVC コンパイラ オプション
MSVC コンパイラ コマンド ラインの構文
/FI (強制インクルード ファイルの名前の指定)
/U/u (シンボルの未定義化)
#undef ディレクティブ (C/C++)
#define ディレクティブ (C/C++)