#define, directive (macro)

Directive de préprocesseur qui crée une macro de type fonction.

#définir l' identificateur( argument0,..., argumentN-1 ) -chaîne de jeton

Paramètres

Élément Description
identificateur
Identificateur de la macro.
Une deuxième # définition pour une macro avec un identificateur qui existe déjà dans le contexte actuel génère une erreur, à moins que la deuxième séquence de jeton soit identique à la première.
( argument0,..., argumentN-1 )
Liste d’arguments pour 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.
Utiliser la concaténation de ligne Placez une barre oblique inverse ( \ ) juste avant le caractère de saut de ligne pour fractionner les directives longues en plusieurs lignes sources.
jeton-chaîne [ facultatif]
Valeur de la macro. Ce paramètre se compose d’une série de jetons, tels que les mots clés, les constantes ou les instructions complètes. Un ou plusieurs espaces blancs doivent séparer ce paramètre du paramètre identificateur ; Cet espace blanc n’est pas considéré comme faisant partie du texte substitué, et n’est pas un espace blanc qui suit le dernier jeton du texte. Utilisez des parenthèses pour vous assurer que les arguments complexes sont interprétés correctement.
Si la valeur du paramètre identificateur est comprise dans le paramètre de chaîne de jeton (même suite à une autre expansion macro), il n’est pas développé.
Si vous excluez ce paramètre, toutes les instances du paramètre d' identificateur sont supprimées du fichier source. L’identificateur reste défini et peut être testé à l’aide des directives # If, # ifdef et # ifndef définies.

Remarques

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 est remplacé par une version du paramètre de chaîne de jeton dont les arguments réels sont remplacés par des 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, à moins que l’argument ne soit précédé d’un # opérateur String (), Charing ( # @) ou de collage de jeton ( # # ), ou qu’il soit 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 jeton dans le compilateur C, en ce que les jetons collés doivent être eux-mêmes des jetons valides. 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 sont les suivants :

float4x4 test

Toutefois, dans le compilateur HLSL, les résultats sont les suivants :

float4 x4 test

Vous pouvez contourner ce comportement en utilisant 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))

Directives de préprocesseur (DirectX HLSL)

#définir des surcharges

#undef, directive (DirectX HLSL)