Direttiva #define (C/C++)
#define crea un oggetto macro, che rappresenta l'associazione di un identificatore o dell'identificatore con parametri con una stringa token.Dopo che la macro è definita, il compilatore può sostituire la stringa token per ogni occorrenza dell'identificatore nel file di origine.
Sintassi
#defineidentificatoretoken-stringascegliere
#defineidentificatore(identificatorescegliere,…,identificatorescegliere)token-stringascegliere
Note
#define la direttiva indica al compilatore di sostituzione token-stringa per ogni occorrenza di identificatore nel file di origine.identificatore viene sostituito solo quando costituisce un token.Ovvero identificatore non viene sostituito se viene visualizzato in un commento, in una stringa, o come parte di un identificatore più lungo.Per ulteriori informazioni, vedere Token C++.
token-stringa l'argomento è costituito da una serie di token, ad esempio le parole chiave, costanti, le istruzioni o completi.Uno o più spazi vuoti necessario separare token-stringa da identificatore.Questo spazio vuoto non è considerato parte del testo sostituito, né costituisce tutto lo spazio vuoto dopo l'ultima token del testo.
In #define senza token-stringa rimuove le occorrenze di identificatore dal file di origine.identificatore rimane definito e può essere testate tramite #if defined e #ifdef direttive.
La seconda forma di sintassi consente di definire una macro del tipo di funzione con parametri.Questo form accetta un elenco facoltativo di parametri che devono trovarsi tra parentesi.dopo che la macro è definita, ogni occorrenza successiva di identificatore( identificatorescegliere,…, identificatorescegliere ) viene sostituito con una versione di token-stringa l'argomento con argomenti effettivi ha sostituito i parametri formali.
I nomi di parametro formale vengono visualizzati in token-stringa per contrassegnare le posizioni in cui i valori vengono sostituiti.Il nome di ciascun parametro può essere presente più volte in token-stringai nomi possono trovarsi in qualsiasi ordine.Il numero di argomenti nella chiamata deve corrispondere al numero di parametri nella definizione macro.L'utilizzo liberale delle parentesi garantisce che gli argomenti effettivi complessi vengono interpretati correttamente.
I parametri formali nell'elenco sono separati da virgole.Ogni nome nell'elenco deve essere univoco e l'elenco deve essere racchiuso tra parentesi.Nessuno spazio possibile separare identificatore e la parentesi di apertura.Concatenazione della linea di utilizzo (inserire una barra rovesciata (\) immediatamente prima del carattere di nuova riga - per le direttive lunghe nelle righe del codice sorgente.L'ambito di un nome di parametro formale estendere la nuova riga che termina token-stringa.
Quando una macro definita nella seconda forma di sintassi, le istanze testuali successive seguite da un elenco di argomenti indicano una chiamata di macro.Gli argomenti effettivi di che segue un'istanza identificatore nel file di origine vengono associati ai parametri formali corrispondenti nella definizione macro.Ogni parametro formale in token-stringa non è preceduto da uno per la creazione di stringhe (#), (charizing#@), o token-incollare (##operatore), né seguito da un oggetto ## l'operatore, viene sostituito da un argomento effettivo corrispondente.Tutte le macro nell'argomento effettivo vengono espanse prima che la direttiva di sostituire il parametro formale.(Gli operatori sono descritti in Operatori del preprocessore).
Negli esempi di macro con gli argomenti illustrati la seconda forma di #define sintassi:
// 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))
Gli argomenti con gli effetti collaterali talvolta determinano le macro a produrre risultati imprevisti.Un parametro formale specificato può essere presente più volte in token-stringa.Se tale parametro formale è sostituito da un'espressione con gli effetti collaterali, l'espressione, con i relativi effetti collaterali, è possibile valutare più di uno volta.(Vedere gli esempi riportati di seguito Token-Incollando operatore (##)).
#undef la direttiva fa sì che la definizione del preprocessore di un identificatore a essere dimenticata.vedere La direttiva del #undef per ulteriori informazioni.
Se il nome della macro definita si verifica in token-stringa (proprio come risultato di un'altra espansione di una macro), non è espanso.
un secondo #define per una macro con lo stesso nome generato un avviso a meno che la seconda sequenza dei token è identica alla prima.
Specifici di Microsoft
Microsoft C/C++ consente di ridefinire una macro se la nuova definizione di sintassi è identica alla definizione originale.Ovvero le due definizioni possono avere nomi di parametri diversi.Questo comportamento è diverso rispetto a ANSI C#, che richiede che le due definizioni siano lessicale identiche.
Ad esempio, le due macro sono identiche tranne che per i nomi di parametro.ANSI C# non consente tale ridefinizione, ma Microsoft C/C++ la compilazione senza errori.
#define multiply( f1, f2 ) ( f1 * f2 )
#define multiply( a1, a2 ) ( a1 * a2 )
Di altra parte, le due macro non sono identiche e genererà un avviso in Microsoft C/C++.
#define multiply( f1, f2 ) ( f1 * f2 )
#define multiply( a1, a2 ) ( b1 * b2 )
Microsoft FINALE specifico
In questo esempio viene illustrato #define direttiva:
#define WIDTH 80
#define LENGTH ( WIDTH + 10 )
La prima istruzione definisce l'identificatore WIDTH ad esempio la costante Integer 80 e definisce LENGTH in termini di WIDTH e la costante Integer 10.ogni occorrenza di LENGTH viene sostituito da (WIDTH + 10).A sua volta, tutte le occorrenze di WIDTH + 10 viene sostituito dall'espressione (80 + 10).le parentesi intorno WIDTH + 10 sono importanti in quanto controllano l'interpretazione nelle istruzioni seguenti:
var = LENGTH * 20;
Dopo la fase di pre-elaborazione l'istruzione diventa:
var = ( 80 + 10 ) * 20;
quale restituisce 1800.senza parentesi, il risultato è:
var = 80 + 10 * 20;
quale restituisce 280.
Specifici di Microsoft
Definizione delle macro e costanti con /D l'opzione del compilatore ha lo stesso effetto di utilizzo di un oggetto #define direttiva per il preprocessoreinizio del file.Fino a 30 macro possono essere definite utilizzando l'opzione /D.
Microsoft FINALE specifico