#define 指令 (宏)
创建类似函数的宏的预处理器指令。
#define 标识符 ( argument0, ... , argumentN-1 ) token-string |
---|
parameters
项 | 说明 |
---|---|
标识符 |
宏的标识符。 对于当前上下文中已存在的标识符的宏,第二个 #define 将生成错误,除非第二个标记序列与第一个标记序列相同。 |
( argument0, ... , argumentN-1 ) |
宏的参数列表。 参数列表以逗号分隔,可以采用任意长度,并且必须用括号括起来。 列表中的每个参数名称必须是唯一的。 没有空格可以分隔 标识符 参数和左括号。 使用行串联将反斜杠 (\) 放在换行符前面,以将长指令拆分为多个源行。 |
token-string [可选] |
宏的值。 此参数由一系列标记组成,例如关键字、常量或完整语句。 一个或多个空格字符必须将此参数与 标识符 参数分开;此空格不被视为替换文本的一部分,文本最后一个标记后的任何空格也不被视为空格。 自由使用括号,以确保正确解释复杂的参数。 如果 标识符 参数的值出现在 令牌字符串 参数 (中,即使由于另一个宏扩展) ,它也不会展开。 如果排除此参数,则会从源文件中删除 标识符 参数的所有实例。 标识符保持定义状态,可以使用 #if定义、#ifdef和#ifndef指令进行测试。 |
备注
在源文件中的 #define 指令之后发生的标识符参数的所有实例都构成宏调用,标识符将被替换为具有实际参数替代形式参数的 token-string 参数版本。 调用中的参数数必须与宏定义中的参数数匹配。 标识符仅在形成令牌时被替换;例如,如果标识符出现在批注中、字符串内或作为较长标识符的一部分,则不会替换该标识符。
#undef 指令指示预处理器忘记标识符的定义;有关详细信息,请参阅 #undef 指令 (DirectX HLSL) 。
使用 /D 编译器选项定义常量的效果与在文件开头使用 #define 指令的效果相同。 最多可以使用 /D 选项定义 30 个宏。
宏调用中的实际参数与宏定义中的相应形式参数匹配。 标记字符串中的每个形式参数将替换为相应的实际参数,除非参数前面是字符串化 (#) 、charizing (#@) 或 token-粘贴 (##) 运算符,或后跟 ## 运算符。 实际自变量中的所有宏都将在指令替换形式参数之前展开。
HLSL 编译器中的令牌粘贴与 C 编译器中的标记粘贴略有不同,即粘贴的令牌本身必须是有效的令牌。 例如,请考虑以下宏定义:
#define MERGE(a, b) a##b
MERGE(float, 4x4) test;
在 C 编译器中,这会导致以下情况:
float4x4 test
但是,在 HLSL 编译器中,这会导致以下情况:
float4 x4 test
可以改用以下宏定义来绕过此行为。
MERGE(MERGE(float, 4), x4) test;
示例
以下示例使用宏来定义游标线。
#define CURSOR(top, bottom) (((top) << 8) | (bottom))
以下示例定义一个宏,该宏检索指定范围内的伪随机整数。
#define getrandom(min, max) \
((rand()%(int)(((max) + 1)-(min)))+ (min))