#define Direktive (C/C++)
#define erstellt ein Makro, das die Zuordnung eines Bezeichners oder eines parametrisierten Bezeichners mit einer Token-Zeichenkette ist.Nachdem das Makro definiert ist, kann der Compiler die Token-Zeichenkette für jedes Vorkommen des Bezeichners in der Quelldatei ersetzen.
Syntax
#defineBezeichnerTokenSTRINGopt
#defineBezeichner(Bezeichneropt,…,Bezeichneropt)TokenSTRINGopt
Hinweise
Die #define-Direktive vom Compiler, TokenSTRING für jedes Vorkommen von Bezeichner in der Quelldatei zu ersetzen.Bezeichner ersetzt wird, wenn es nur ein Token bildet.Das heißt, Bezeichner nicht ersetzt, wenn es in einem Kommentar in einer Zeichenfolge oder als Teil eines längeren Bezeichners wird.Weitere Informationen finden Sie unter C++-Token.
Das TokenSTRING-Argument besteht aus einer Reihe von Token, z. B. Schlüsselwörter, Konstanten oder vollständigen Anweisungen.Eine oder mehrere Leerzeichen müssen TokenSTRING von Bezeichnertrennen.Diese Leerraum betrachtet werden nicht als Teil des ersetzten Text, sind dennoch alle Leerstellen, die dem letzten Tokens des Texts folgt.
#define ohne TokenSTRING entfernt Vorkommen von Bezeichner aus der Quelldatei.Bezeichner bleibt definiert und kann getestet werden, indem die #if defined und #ifdef-Direktiven verwendet.
Das zweite Formular Syntax definiert ein Ähnliches FUNCTION Makro mit Parametern.Dieses Formular nimmt eine optionale Liste von Parametern, die in Klammern angezeigt werden müssen.Nachdem das Makro definiert ist, wird bei nachfolgenden Vorkommen von Bezeichner,…, ( BezeichneroptBezeichneropt ) von einer Version des TokenSTRING-Arguments ersetzt, die die Parameter enthält, die zum formalen Parameter ersetzt werden.
Formale Parameternamen werden in TokenSTRING , die Adressen zu markieren, in denen Werte ersetzt werden.Jeder Parametername kann mehrmals in TokenSTRINGangezeigt werden, und die Namen können in beliebiger Reihenfolge angegeben werden.Die Anzahl der Argumente im Aufruf muss mit der Anzahl von Parametern in der Makrodefinition übereinstimmen.Liberaler Verwendung von Klammern wird sichergestellt, dass komplexe Parameter ordnungsgemäß interpretiert werden.
Die formale Parameter in der Liste sind durch Kommas getrennt.Jeder Name in der Liste muss eindeutig sein, und die Liste muss in Klammern eingeschlossen werden.Keine Leerzeichen können Bezeichner und die öffnende Klammer trennen.Verwenden von Zeilen verkettung — setzen Sie einen umgekehrten Schrägstrich (\) direkt vor dem Zeilenumbruchzeichen — Direktive für lange auf mehrere Quellzeilen.Der Gültigkeitsbereich eines formalen Parameternamens erweitert die neue dieser Zeile endet TokenSTRING.
Wenn ein Makro in der zweiten Syntax Form definiert wurde, geben die folgende Text Instanzen, die von einer Argumentliste folgen, einen Makro-Aufruf an.Die Parameter, die einer Instanz von Bezeichner in der Quelldatei folgt, sind in den entsprechenden formalen Parameter in der Makrodefinition verglichen.Jeder formalen Parameter in TokenSTRING , der nicht von einem Stringizing (#) aus dem Charizing (#@) oder vom Token-Einfügen (##) vorangestellt ist oder nicht, gefolgt von einem Operator ## wird durch den entsprechenden Parameter ersetzt.Alle Makros im übergebenen Parameter werden erweitert, bevor die Direktive den formalen Parametern ersetzen.(Die Operatoren werden in Präprozessor-Operatoren) beschrieben.
Die folgenden Beispiele veranschaulichen mit Argumenten von Makros das zweite Form der #define Syntax:
// 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))
Argumente mit Nebeneffekten führen, Makros auch unerwartete Ergebnisse zu erzielen.Ein angegebener formalen Parameter wird möglicherweise mehr als einmal in TokenSTRING.Wenn der formalen Parameter durch einen Ausdruck mit Nebeneffekten ersetzt wird, wird der Ausdruck mit Nebeneffekten, die mehrere Male ausgewertet werden.(Weitere Informationen finden Sie in den Beispielen unter Operator (##) Token-Einfügen).
Die #undef-Direktive wird die Definition eines Bezeichners Präprozessordefinitionen übergangen werden soll.Weitere Informationen finden Sie unter Die #undef Directive .
Wenn der Name des Makros, die definiert wird, in TokenSTRING (auch als Ergebnis einer anderen Makroerweiterung) auftritt, wird er nicht erweitert.
Eine Sekunde #define für ein Makro mit demselben Namen generiert eine Warnung, es sei denn, die zweite Token ist identisch mit der ersten Sequenz aus.
Microsoft-spezifisch
Microsoft C/C++ können Sie ein Makro neu definiert, wenn die neue Definition der ursprünglichen Definition syntaktisch identisch ist.Das bedeutet, dass die beiden Definitionen unterschiedliche Namen verfügen.Dieses Verhalten unterscheidet sich von ANSI C, die erfordert, dass die beiden Definitionen lexikalisch gleich sind.
Beispielsweise sind die folgenden beiden Makros außer den Parameternamen identisch.ANSI C# lässt keine solche Neudefinition, jedoch ohne Fehler kompiliert Microsoft C/C++.
#define multiply( f1, f2 ) ( f1 * f2 )
#define multiply( a1, a2 ) ( a1 * a2 )
Andererseits sind die folgenden beiden Makros nicht identisch und werden in Microsoft C/C++ eine Warnung generiert wird.
#define multiply( f1, f2 ) ( f1 * f2 )
#define multiply( a1, a2 ) ( b1 * b2 )
Microsoft ENDES bestimmten
Dieses Beispiel veranschaulicht die #define-Direktiven:
#define WIDTH 80
#define LENGTH ( WIDTH + 10 )
Die erste Anweisung definiert den Bezeichner WIDTH als die ganzzahlige Konstante 80 und definiert LENGTH im Hinblick auf WIDTH und die ganzzahlige Konstante 10.Jedes Vorkommen von LENGTH wird durch ersetzt (WIDTH + 10).Im Gegenzug wird jedes Vorkommen von WIDTH + 10 vom Ausdruck (80 + 10) ersetzt.Die Klammern um WIDTH + 10 sind wichtig, da sie die Interpretation in Anweisungen wie z. B. Folgendes steuern:
var = LENGTH * 20;
Nach der Vorverarbeitungsphase wird die Anweisung:
var = ( 80 + 10 ) * 20;
welches bis 1800 ausgewertet werden.Ohne Klammern ist das Ergebnis:
var = 80 + 10 * 20;
welches bis 280 ausgewertet werden.
Microsoft-spezifisch
Das Definieren von Makros und Konstanten mit der Compileroption /D hat denselben Effekt wie mithilfe #define , die Direktive am Anfang der Datei vorverarbeitet werden soll.Maximal 30 Makros können definiert werden, indem die /D- verwendet.
Microsoft ENDES bestimmten