Condividi tramite


direttiva #define (macro)

Direttiva del preprocessore che crea una macro simile a una funzione.

#define identifier( argument0, ... , argumentN-1 ) token-string

Parametri

Elemento Descrizione
Identificatore
Identificatore della macro.
Un secondo #define per una macro con un identificatore già esistente nel contesto corrente genera un errore a meno che la seconda sequenza di token non sia identica alla prima.
( argument0, ... , argumentN-1 )
Elenco di argomenti della macro. L'elenco di argomenti è delimitato da virgole, può essere di qualsiasi lunghezza e deve essere racchiuso tra parentesi. Ogni nome di argomento nell'elenco deve essere univoco. Nessun spazio vuoto può separare il parametro dell'identificatore e la parentesi di apertura.
Usare la concatenazione riga posizionare una barra rovesciata (\) immediatamente prima del carattere di nuova riga per suddividere le direttive long su più righe di origine.
token-string [facoltativo]
Valore della macro. Questo parametro è costituito da una serie di token, ad esempio parole chiave, costanti o istruzioni complete. Uno o più caratteri di spazio vuoto devono separare questo parametro dal parametro dell'identificatore ; questo spazio vuoto non è considerato parte del testo sostituito, né è uno spazio vuoto dopo l'ultimo token del testo. Utilizzare le parentesi liberali per garantire che gli argomenti complessi vengano interpretati correttamente.
Se il valore del parametro dell'identificatore si verifica all'interno del parametro token-string (anche in seguito a un'altra espansione di macro), non viene espanso.
Se si esclude questo parametro, tutte le istanze del parametro dell'identificatore vengono rimosse dal file di origine. L'identificatore rimane definito e può essere testato usando le direttive #if definite, #ifdef e #ifndef.

Commenti

Tutte le istanze del parametro dell'identificatore che si verificano dopo la direttiva #define nel file di origine costituiscono una chiamata di macro e l'identificatore verrà sostituito da una versione del parametro token-string con argomenti effettivi sostituiti per parametri formali. Il numero di parametri nella chiamata deve corrispondere al numero di parametri nella definizione della macro. L'identificatore viene sostituito solo quando forma un token; Ad esempio, l'identificatore non viene sostituito se viene visualizzato in un commento, all'interno di una stringa o come parte di un identificatore più lungo.

La direttiva #undef indica al preprocessore di dimenticare la definizione di un identificatore; per altre informazioni, vedere direttiva #undef (DirectX HLSL).

La definizione di costanti con l'opzione del compilatore /D ha lo stesso effetto dell'uso della direttiva #define all'inizio del file. È possibile definire fino a 30 macro con l'opzione /D.

Gli argomenti effettivi nella chiamata di macro vengono confrontati con gli argomenti formali corrispondenti nella definizione della macro. Ogni argomento formale nella stringa del token viene sostituito dall'argomento effettivo corrispondente, a meno che l'argomento non sia preceduto da una stringa (#), il ridimensionamento di caratteri (#@) o l'operatore token-incolla (##) oppure è seguito da un operatore ##. Eventuali macro presenti nell'argomento effettivo vengono espanse prima che la direttiva sostituisca il parametro formale.

Il incollamento dei token nel compilatore HLSL è leggermente diverso da quello incollato nel compilatore C, in quanto i token incollati devono essere token validi autonomamente. Si consideri ad esempio la definizione di macro seguente:

#define MERGE(a, b) a##b
MERGE(float, 4x4) test;

Nel compilatore C, il risultato è il seguente:

float4x4 test

Nel compilatore HLSL, tuttavia, il risultato è il seguente:

float4 x4 test

È possibile aggirare questo comportamento usando invece la definizione di macro seguente.

MERGE(MERGE(float, 4), x4) test;

Esempio

Nell'esempio seguente viene utilizzata una macro per definire le linee del cursore.

#define CURSOR(top, bottom) (((top) << 8) | (bottom))

Nell'esempio seguente viene definita una macro che recupera un intero pseudorandomo nell'intervallo specificato.

#define getrandom(min, max) \
((rand()%(int)(((max) + 1)-(min)))+ (min))

Direttive del preprocessore (DirectX HLSL)

overload #define

Direttiva #undef (DirectX HLSL)