Поделиться через


Директива #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))

Директивы препроцессора (DirectX HLSL)

Перегрузки #define

Директива #undef (DirectX HLSL)