/D(预处理器定义)

定义源文件的预处理符号。

语法

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

备注

可以将此符号与 #if#ifdef 一起使用,以便有条件地编译源代码。 在代码中重新定义或通过 #undef 指令在代码中取消定义符号前,符号定义保持有效。

/D 与源代码文件开头的 #define 指令具有相同效果。 区别在于,/D 在命令行上去除引号,指令 #define 则会保留引号。 /D 和符号之间可以有空格。 符号和等号之间,或者等号和分配的任何值之间不能有空格。

默认情况下,与符号关联的值为 1。 例如,/D name 等效于 /D name=1。 在本文末尾的示例中,显示 TEST 的定义以输出 1

使用 /D name= 进行编译将导致符号 name 没有关联值。 尽管该符号仍可用于有条件地编译代码,但它不会计算出任何结果。 在本示例中,如果使用 /DTEST= 进行编译,则会发生错误。 此行为类似于带或不带值使用 #define

选项 /D 不支持类似于函数的宏定义。 若要插入无法在命令行上定义的定义,请考虑使用 /FI(命名强制包含文件) 编译器选项。

可以在命令行上多次使用 /D 来定义更多符号。 如果多次定义同一个符号,则使用最后一个定义。

此命令在 TEST.c 中定义符号 DEBUG:

CL /DDEBUG TEST.C

此命令移除 TEST.c 中关键字 __far 的所有匹配项:

CL /D __far= TEST.C

不能将 CL 环境变量设置为包含等号的字符串。 若要将 /DCL 环境变量一起使用,则必须指定数字符号(#)而非等号:

SET CL=/DTEST#0

在命令提示符处定义预处理符号时,应同时考虑编译器分析规则和 shell 分析规则。 例如,若要在程序中定义百分号预处理符号 (%),请在命令提示符处指定两个百分号字符 (%%)。 如果只指定一个,则会发出分析错误。

CL /DTEST=%% TEST.C

在 Visual Studio 开发环境中设置此编译器选项

  1. 打开项目“属性页” 对话框。 有关详细信息,请参阅在 Visual Studio 中设置 C++ 编译器和生成属性

  2. 选择“配置属性”>“C/C++”>“预处理器”属性页

  3. 打开“预处理器定义”属性的下拉菜单,然后选择“编辑”。

  4. 在“预处理器定义”对话框中,添加、修改、或删除一个或多个定义(每行一个)。 选择“确定”以保存更改 。

    无需在此处指定的定义中包含“/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++)