directive #define (macro)
Directive de préprocesseur qui crée une macro de type fonction.
#define identifier( argument0, ... , argumentN-1 ) token-string |
---|
Paramètres
Élément | Description |
---|---|
Identificateur |
Identificateur de la macro. Une deuxième #define pour une macro avec un identificateur qui existe déjà dans le contexte actuel génère une erreur, sauf si la deuxième séquence de jetons est identique à la première. |
( argument0, ... , argumentN-1 ) |
Liste des arguments de la macro. La liste d’arguments est délimitée par des virgules, peut être de n’importe quelle longueur et doit être placée entre parenthèses. Chaque nom d’argument dans la liste doit être unique. Aucun espace blanc ne peut séparer le paramètre d’identificateur et la parenthèse ouvrante. Utilisez la concaténation de ligne pour placer une barre oblique inverse (\) immédiatement avant le caractère de nouvelle ligne pour fractionner les directives longues en plusieurs lignes sources. |
token-string [facultatif] |
Valeur de la macro. Ce paramètre se compose d’une série de jetons, tels que des mots clés, des constantes ou des instructions complètes. Un ou plusieurs caractères d’espace blanc doivent séparer ce paramètre du paramètre d’identificateur ; cet espace blanc n’est pas considéré comme faisant partie du texte substitué, ni aucun espace blanc suivant le dernier jeton du texte. Utilisez librement les parenthèses pour vous assurer que les arguments complexes sont interprétés correctement. Si la valeur du paramètre d’identificateur se trouve dans le paramètre token-string (même à la suite d’une autre extension de macro), elle n’est pas développée. Si vous excluez ce paramètre, toutes les instances du paramètre identifier sont supprimées du fichier source. L’identificateur reste défini et peut être testé à l’aide des directives #if définies, #ifdef et #ifndef. |
Notes
Toutes les instances du paramètre d’identificateur qui se produisent après la directive #define dans le fichier source constituent un appel de macro, et l’identificateur sera remplacé par une version du paramètre de chaîne de jeton dont les arguments réels sont remplacés par les paramètres formels. Le nombre de paramètres dans l’appel doit correspondre au nombre de paramètres dans la définition de macro. L’identificateur est remplacé uniquement lorsqu’il forme un jeton ; par exemple, l’identificateur n’est pas remplacé s’il apparaît dans un commentaire, dans une chaîne ou dans le cadre d’un identificateur plus long.
La directive #undef indique au préprocesseur d’oublier la définition d’un identificateur ; Pour plus d’informations, consultez directive #undef (DirectX HLSL).
La définition de constantes avec l’option de compilateur /D a le même effet que l’utilisation de la directive #define au début de votre fichier. Jusqu’à 30 macros peuvent être définies avec l’option /D.
Les arguments réels dans l’appel de macro sont mis en correspondance avec les arguments formels correspondants dans la définition de macro. Chaque argument formel dans la chaîne de jeton est remplacé par l’argument réel correspondant, sauf si l’argument est précédé d’un opérateur stringizing (#), charizing (#@) ou de collage de jetons (##), ou est suivi d’un opérateur ##. Toutes les macros figurant dans l'argument réel sont développées avant que la directive ne remplace le paramètre formel.
Le collage de jetons dans le compilateur HLSL est légèrement différent du collage de jetons dans le compilateur C, car les jetons collés doivent être des jetons valides par eux-mêmes. Par exemple, considérez la définition de macro suivante :
#define MERGE(a, b) a##b
MERGE(float, 4x4) test;
Dans le compilateur C, les résultats suivants sont les suivants :
float4x4 test
Toutefois, dans le compilateur HLSL, les résultats suivants sont les suivants :
float4 x4 test
Vous pouvez contourner ce comportement à l’aide de la définition de macro suivante à la place.
MERGE(MERGE(float, 4), x4) test;
Exemples
L’exemple suivant utilise une macro pour définir des lignes de curseur.
#define CURSOR(top, bottom) (((top) << 8) | (bottom))
L’exemple suivant définit une macro qui récupère un entier pseudo-aléatoire dans la plage spécifiée.
#define getrandom(min, max) \
((rand()%(int)(((max) + 1)-(min)))+ (min))