Share via


Directive #define (C/C++)

#define crée une macro, qui est l'association d'un identificateur ou de l'identificateur paramétrée avec une chaîne de jeton.Une fois la macro définie, le compilateur peut substituer la chaîne de jeton pour chaque occurrence de l'identificateur dans le fichier source.

Syntaxe

#defineidentificateurjeton-chaîneopt

#defineidentificateur(identificateuropt,…,identificateuropt)jeton-chaîneopt

Notes

la directive d' #define fait pour substituer le compilateur jeton-chaîne pour chaque occurrence d' identificateur dans le fichier source.identificateur est remplacé uniquement lorsqu'il forme un jeton.Autrement dit, identificateur n'est pas remplacé s'il apparaît dans un commentaire, dans une chaîne, ou dans le cadre d'un plus long identificateur.Pour plus d'informations, consultez Jetons C++.

L'argument de jeton-chaîne se compose d'une série de jetons, telles que les mots clés, des constantes, des instructions ou terminées.Un ou plusieurs espaces blancs doivent séparer jeton-chaîne d' identificateur.Cet espace blanc n'est pas considérée comme une partie du texte substitué, ni par tout espace blanc qui suit le dernier jeton du texte.

#define sans jeton-chaîne supprime des occurrences d' identificateur du fichier source.identificateur reste fixe et peut être testé à l'aide de les directives d' #if defined et d' #ifdef .

La deuxième forme de syntaxe définit un comme une fonction avec des paramètres.ce formulaire reçoit une liste facultative de paramètres qui doivent apparaître entre parenthèses.Une fois la macro définie, chaque occurrence suivante d' identificateur( identificateuropt,…, identificateuropt ) est remplacée par une version de l'argument de jeton-chaîne qui a les arguments réels substitués à des paramètres formels.

Les noms de paramètres formels apparaissent dans jeton-chaîne marquer les emplacements où des valeurs réelles sont substituées.Chaque nom de paramètre peut apparaître plusieurs fois dans jeton-chaîne, et les noms peuvent apparaître dans n'importe quel ordre.Le nombre d'arguments dans l'appel doit correspondre au nombre de paramètres dans la définition de macro.L'utilisation fréquente des parenthèses garantit que les arguments réels complexes sont interprètes correctement.

Les paramètres dans la liste sont séparés par des virgules.Chaque nom dans la liste doit être unique, la liste doit être placée entre parenthèses.Aucun espace ne peut séparer identificateur et la parenthèse ouvrante.Concaténation de ligne d'utilisation - placez une barre oblique inverse (\) immédiatement avant le caractère de saut de ligne - pour des directives supérieure sur plusieurs lignes sources.la portée d'un nom de paramètre formel étend à la nouvelle ligne qui termine jeton-chaîne.

Lorsqu'un a été définie dans la deuxième forme de syntaxe, les instances textuelles suivantes suivi d'une liste d'arguments indiquent une macro-instruction.Les arguments réels qui suit une instance d' identificateur dans le fichier source sont mis en correspondance avec les paramètres formels correspondants dans la définition de macro.Chaque paramètre formel dans jeton-chaîne qui n'est pas précédé de transformation en chaîne (#), charizing (#@), ou jeton-en collant l'opérateur (d'##), ou n'est pas suivi d'un opérateur d' ## , est remplacé par l'argument réel correspondant.Toutes les macros dans l'argument réel sont développées avant la directive remplace le paramètre formel.(Les opérateurs sont décrits dans opérateurs de préprocesseur.)

les exemples suivants des macros avec des arguments montrent le deuxième formulaire de la syntaxe d' #define :

// Macro to define cursor lines 
#define CURSOR(top, bottom) (((top) << 8) | (bottom))

// Macro to get a random integer with a specified range 
#define getrandom(min, max) \
    ((rand()%(int)(((max) + 1)-(min)))+ (min))

Les arguments avec des effets secondaires entraînent parfois des macros des résultats inattendus de produit.Un paramètre formel donné peut apparaître plusieurs fois dans jeton-chaîne.Si ce paramètre formel est remplacée par une expression avec des effets secondaires, l'expression, avec ses effets secondaires, peut être évaluée plusieurs fois.(Consultez les exemples sous De collage de jeton l'opérateur (##).)

la directive d' #undef provoque la définition du préprocesseur d'un identificateur à oublier.Consultez La directive de #undef pour plus d'informations.

Si le nom de la macro définie se produit dans jeton-chaîne (même comme un résultat d'une autre expansion macro), il n'est pas développé.

Seconde #define pour une macro avec le même nom génère un avertissement à moins que la deuxième séquence de jeton est identique à la première.

Spécifique à Microsoft

Microsoft C/C++ vous permet de redéfinir une macro si la nouvelle définition a une syntaxe identique à la définition d'origine.En d'autres termes, les deux définitions peuvent avoir des noms de paramètres.Ce comportement diffère de ANSI C, qui requiert que les deux définitions sont lexicalement identiques.

Par exemple, les deux macros suivantes sont identiques à l'exception de les noms de paramètres.ANSI C ne permet pas une telle redéfinition, mais les compilations Microsoft C/C++ il sans erreur.

#define multiply( f1, f2 ) ( f1 * f2 )
#define multiply( a1, a2 ) ( a1 * a2 )

En revanche, les deux macros suivantes ne sont pas identiques et génèrent un avertissement dans Microsoft C/C++.

#define multiply( f1, f2 ) ( f1 * f2 )
#define multiply( a1, a2 ) ( b1 * b2 )

TERMINEZ le détail de Microsoft

Cet exemple illustre la directive d' #define :

#define WIDTH       80
#define LENGTH      ( WIDTH + 10 )

La première instruction définit l'identificateur WIDTH comme constante entière 80 et définit LENGTH en termes de WIDTH et constante entière 10.chaque occurrence d' LENGTH est remplacée par (WIDTH + 10).ensuite, chaque occurrence d' WIDTH + 10 est remplacée par l'expression (80 + 10).Les parenthèses d' WIDTH + 10 sont importantes parce qu'elles contrôlent la traduction dans les instructions suivantes :

var = LENGTH * 20;

après l'étape de prétraitement l'instruction devient :

var = ( 80 + 10 ) * 20;

ce qui a pour valeur 1800.sans parenthèses, le résultat est :

var = 80 + 10 * 20;

ce qui a pour valeur 280.

Spécifique à Microsoft

Définir des macros et des constantes avec l'option du compilateur de /D a le même effet qu'à l'aide de #define prétraitant la directive au début de votre fichier.Jusqu'à 30 macros peuvent être définies à l'aide de l'option /D.

détail de FIN Microsoft

Voir aussi

Référence

Directives de préprocesseur