diretiva #define (macro)
Diretiva de pré-processador que cria uma macro semelhante a uma função.
#define identifier( argument0, ... , argumentN-1 ) token-string |
---|
Parâmetros
Item | Descrição |
---|---|
Identificador |
Identificador da macro. Um segundo #define para uma macro com um identificador que já existe no contexto atual gera um erro, a menos que a segunda sequência de token seja idêntica à primeira. |
( argument0, ... , argumentN-1 ) |
Lista de argumentos para a macro. A lista de argumentos é delimitada por vírgulas, pode ter qualquer comprimento e deve ser colocada entre parênteses. Cada nome de argumento na lista deve ser exclusivo. Nenhum espaço em branco pode separar o parâmetro identificador e o parêntese de abertura. Use a concatenação de linha coloque uma barra invertida (\) imediatamente antes do caractere de nova linha para dividir diretivas longas em várias linhas de origem. |
token-string [opcional] |
Valor da macro. Esse parâmetro consiste em uma série de tokens, como palavras-chave, constantes ou instruções completas. Um ou mais caracteres de espaço em branco devem separar esse parâmetro do parâmetro identificador ; esse espaço em branco não é considerado parte do texto substituído, nem qualquer espaço em branco após o último token do texto. Faça uso liberal de parênteses para garantir que argumentos complicados sejam interpretados corretamente. Se o valor do parâmetro identificador ocorrer dentro do parâmetro de cadeia de caracteres de token (mesmo como resultado de outra expansão de macro), ele não será expandido. Se você excluir esse parâmetro, todas as instâncias do parâmetro identificador serão removidas do arquivo de origem. O identificador permanece definido e pode ser testado usando as diretivas #if definidas, #ifdef e #ifndef. |
Comentários
Todas as instâncias do parâmetro identificador que ocorrem após a diretiva #define no arquivo de origem constituem uma chamada de macro e o identificador será substituído por uma versão do parâmetro de cadeia de caracteres de token que tem argumentos reais substituídos por parâmetros formais. O número de parâmetros na chamada deve corresponder ao número de parâmetros na definição de macro. O identificador é substituído somente quando forma um token; por exemplo, o identificador não será substituído se aparecer em um comentário, dentro de uma cadeia de caracteres ou como parte de um identificador mais longo.
A diretiva #undef instrui o pré-processador a esquecer a definição de um identificador; para obter mais informações, consulte Diretiva #undef (DirectX HLSL).
Definir constantes com a opção do compilador /D tem o mesmo efeito que usar a diretiva #define no início do arquivo. Até 30 macros podem ser definidas com a opção /D.
Os argumentos reais na chamada de macro correspondem aos argumentos formais correspondentes na definição de macro. Cada argumento formal na cadeia de caracteres de token é substituído pelo argumento real correspondente, a menos que o argumento seja precedido por um operador stringizing (#), charizing (#@) ou token-pasting (##) ou seja seguido por um operador ##. As macros no argumento real são expandidas antes da política substituir o parâmetro formal.
A colagem de token no compilador HLSL é ligeiramente diferente da colagem de token no compilador C, na qual os tokens colados devem ser tokens válidos por conta própria. Por exemplo, considere a seguinte definição de macro:
#define MERGE(a, b) a##b
MERGE(float, 4x4) test;
No compilador C, isso resulta no seguinte:
float4x4 test
No entanto, no compilador HLSL, isso resulta no seguinte:
float4 x4 test
Você pode contornar esse comportamento usando a seguinte definição de macro.
MERGE(MERGE(float, 4), x4) test;
Exemplos
O exemplo a seguir usa uma macro para definir linhas de cursor.
#define CURSOR(top, bottom) (((top) << 8) | (bottom))
O exemplo a seguir define uma macro que recupera um inteiro de pseudorandom no intervalo especificado.
#define getrandom(min, max) \
((rand()%(int)(((max) + 1)-(min)))+ (min))