Директива #define (макрос)
Директива препроцессора, которая создает макрос, подобный функции.
#define identifier( argument0, ... , argumentN-1 ) token-string |
---|
Параметры
Элемент | Описание |
---|---|
Идентификатор |
Идентификатор макроса. Вторая #define для макроса с идентификатором, который уже существует в текущем контексте, создает ошибку, если вторая последовательность маркеров не идентична первой. |
( argument0, ... , argumentN-1 ) |
Список аргументов макроса. Список аргументов разделен запятыми, может иметь любую длину и должен быть заключен в круглые скобки. Имя каждого аргумента в списке должно быть уникальным. Пробелы не могут разделять параметр идентификатора и открываемую скобку. Используйте объединение строк, чтобы поместить обратную косую черту (\) непосредственно перед символом новой строки, чтобы разделить длинные директивы на несколько исходных строк. |
token-string [необязательно] |
Значение макроса. Этот параметр состоит из ряда токенов, таких как ключевые слова, константы или полные операторы. Один или несколько пробелов должны отделять этот параметр от параметра идентификатора ; этот пробел не считается частью замещаемого текста, а также не является пробелом после последнего маркера текста. Используйте скобки, чтобы обеспечить правильную интерпретацию сложных аргументов. Если значение параметра идентификатора находится в параметре token-string (даже в результате другого расширения макроса), оно не расширяется. При исключении этого параметра все экземпляры параметра идентификатора удаляются из исходного файла. Идентификатор остается определенным и может быть протестирован с помощью директив #if defined, #ifdef и #ifndef. |
Комментарии
Все экземпляры параметра идентификатора , возникающие после директивы #define в исходном файле, представляют собой вызов макроса, и идентификатор будет заменен версией параметра строки токена , в которую фактические аргументы заменены формальными параметрами. Количество параметров в вызове должно совпадать с числом параметров в определении макроса. Идентификатор заменяется только в том случае, если он формирует токен; Например, идентификатор не заменяется, если он отображается в комментарии, в строке или в составе более длинного идентификатора.
Директива #undef указывает препроцессору забыть определение идентификатора; Дополнительные сведения см. в разделе Директива #undef (DirectX HLSL).
Определение констант с помощью параметра компилятора /D имеет тот же эффект, что и использование директивы #define в начале файла. С помощью параметра /D можно определить до 30 макросов.
Фактические аргументы в вызове макроса сопоставляются с соответствующими формальными аргументами в определении макроса. Каждый формальный аргумент в строке токена заменяется соответствующим фактическим аргументом, если перед аргументом не стоит оператор со строковым преобразованием (#), charizing (#@) или оператором вставки маркера (###) или оператором ##. Перед заменой директивой формального параметра все макросы в фактическом аргументе разворачиваются.
Вставка маркеров в компиляторе 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))