Share via


#define指令(c/C++)

#define 创建 宏,是一个标识符或参数化的标识符与一个标记字符串。 在宏定义后,编译器无法在标识符的每个匹配项在源文件中替换为标记字符串。

语法

#define标识符标记字符串opt

#define标识符(标识符opt, …,标识符opt)标记字符串opt

备注

#define 指令使编译器会 标识符 每次出现在源文件的替代方法 标记字符串 。 ,仅当窗体标记时, 标识符 替换。 即是较长的标识符的一部分,,因此,如果显示在注释,在字符串,或 标识符 不会替换。 有关更多信息,请参见 C++标记

标记字符串 参数包含一系列令牌,如关键字、常数或完全语句。 一个或多个空白字符必须从 标识符分隔 标记字符串 。 此空白视为的一部分被替换的文本,也不遵循该文本的最后一个标记的所有空格。

不 标记字符串 的 #define 从源文件中移除 标识符 匹配项。 使用 #if defined 和 #ifdef 指令, 标识符 保持定义可以测试。

第二种语法形式定义带有参数的类似于函数的宏。 此窗体接受一个选项卡必须括号中出现的参数列表。 在宏定义后,每个后续匹配项 标识符( 标识符opt,…, 标识符opt ) 会在形参替换的实参 标记字符串 参数的版本替换。

形参名称将显示 标记字符串 指示实际值被替换的位置。 每个参数名能出现在 标记字符串多次,并且,名称可以按任意顺序显示。 参数的数目调用必须匹配的参数数量。宏的定义。 对括号的大量用于确保复杂实参正确解释。

在列表中的形参由逗号分隔。 在列表中的每个名称必须是唯一的,因此,必须括在括号列表。 不能空格分隔 标识符 和左括号。 为多个源行的长度的指令使用行串联 —将反斜杠 (\) 在换行符之前 )。 形参名称范围扩展到该新行尾 标记字符串。

当宏定义。第二种语法形式时,后面的后续文本实例参数表指示宏调用。 实参后面 标识符 实例中的源文件中都与在宏定义的相应形参。 不在字符串在 标记字符串 的每个形参 (#), charizing (#@),或者标记粘贴 (##) 运算符之后,也不受 ## 运算符执行,将对应的实参替换。 ,在指令替换形参之前,在实参的所有宏展开。 (运算符在 预处理器运算符所述。)

宏下面的示例使用参数的声明 #define 语法中的第二种形式:

// Macro to define cursor lines 
#define CURSOR(top, bottom) (((top) << 8) | (bottom))

// Macro to get a random integer with a specified range 
#define getrandom(min, max) \
    ((rand()%(int)(((max) + 1)-(min)))+ (min))

与副作用的参数有时将导致宏会导致意外的结果。 特定形参可能会超过 标记字符串的一次。 如果该形参被替换表达式具有副作用,表达式,以及其副作用,可以计算超过一次。 (请参见示例。 标记粘贴运算符 (##)下。)

#undef 指令使标识符的预处理器定义保留下来。 请参见 #undef 指令 有关更多信息。

如果定义的宏的名称。 标记字符串 发生 (即使另一个宏扩展的结果),它不会展开。

,除非第二个标记顺序与第一个,是相同的宏的一个 #define 同名会生成警告。

Microsoft 专用

,如果新定义与原始定义,是语法上的相同的 Microsoft C/C++ 允许您重新定义宏。 换言之,两个定义可能具有不同的参数名称。 此行为与 ANSI C 不同,需要两定义词法相同。

例如,下面的两个宏相同的 (参数名称。 ANSI C 不允许这种重定义,但是, Microsoft C/C++ 生成它不会出错。

#define multiply( f1, f2 ) ( f1 * f2 )
#define multiply( a1, a2 ) ( a1 * a2 )

另一方面,下面的两个宏不是相同的,并生成在 Microsoft C/C++ 的警告。

#define multiply( f1, f2 ) ( f1 * f2 )
#define multiply( a1, a2 ) ( b1 * b2 )

特定于 Microsoft 的结尾

此示例演示 #define 指令:

#define WIDTH       80
#define LENGTH      ( WIDTH + 10 )

第一个语句定义标识符 WIDTH 为整型常数 80 并定义 LENGTH 基于 WIDTH 和整数常数 10。 LENGTH 每个匹配项替换 (WIDTH + 10)。 然后, WIDTH + 10 每个匹配项将该表达式 (80 + 10) 替换。 ,因为这些控件在语句中解释例如,在 WIDTH + 10 两边的括号非常重要:

var = LENGTH * 20;

在预处理阶段之后语句变成:

var = ( 80 + 10 ) * 20;

的计算结果为 1800。 没有括号,则结果是:

var = 80 + 10 * 20;

的计算结果为 280。

Microsoft 专用

定义宏和常数。 /D 编译器选项有效果和使用预处理指令相同的 #define 在文件的开头。 使用 /D 选项, 30 宏中定义。

特定于 Microsoft 的结尾

请参见

参考

预处理器指令