Il miglior tutorial C ++ preprocessore Nel 2024, in questo tutorial puoi imparare pre-elaborazione #define,Funzioni macro,compilazione condizionale,# e ## operatori,C ++ macro predefinite,
Alcune direttive del preprocessore, dirige il preprocessore al compilatore prima della compilazione vera e propria è necessario completare.
Tutte le direttive del preprocessore sono (#) a partire dal cancelletto, può apparire solo un carattere di spazio prima che le direttive del preprocessore. C ++ direttiva del preprocessore non è una dichiarazione, quindi non sono un punto e virgola, alla fine ().
Abbiamo visto tutte le istanze precedenti hanno direttiva#include.Questa macro si file di intestazione utilizzato essere inclusi nel file di origine.
C ++ supporta inoltre una serie di direttive di pre-elaborazione, come ad esempio # includono, # definire, se #, # altro, # linea, ecc, diamo un'occhiata a queste istruzioni importanti.
direttiva del preprocessore #define utilizzato per creare un costanti simboliche. La costante simbolica è solitamente chiamatomacro, la forma del comando generale è:
#define macro-name replacement-text
Quando questa riga di codice appaiono in un file, il file viene visualizzato nella successiva Tutte le macro saranno sostituiti con sostituzione del testo prima che il programma viene compilato. Ad esempio:
#include <iostream> using namespace std; #define PI 3.14159 int main () { cout << "Value of PI :" << PI << endl; return 0; }
Ora, cerchiamo di verificare questo codice, date un'occhiata ai risultati del pretrattamento. Supponiamo che il file sorgente già esistente, quindi utilizzare l'opzione -E di compilare e di reindirizzare i risultati per test.p. Ora, se si guarda test.p di file, vedrete che contiene già un sacco di informazioni, e il valore è stato modificato nella parte inferiore del file come segue:
$gcc -E test.cpp > test.p it. int main () { cout << "Value of PI :" << 3.14159 << endl; return 0; }
È possibile utilizzare # define per definire la macro come segue con un parametro:
#include <iostream> using namespace std; #define MIN(a,b) (((a)<(b)) ? a : b) int main () { int i, j; i = 100; j = 30; cout <<"The minimum is " << MIN(i, j) << endl; return 0; }
Quando il codice di cui sopra è compilato ed eseguito, produce i seguenti risultati:
The minimum is 30
Ci sono diversi comandi che possono essere utilizzati in modo selettivo da parte del codice sorgente del programma viene compilato. Questo processo è noto come la compilazione condizionale.
Struttura e scegliere se le condizioni strutturali molto simile al preprocessore. Si consideri il seguente codice brano preprocessore:
#ifndef NULL #define NULL 0 #endif
Si può fare solo se compilato con il debug, il debug può essere realizzato utilizzando una macro, come segue:
#ifdef DEBUG cerr <<"Variable x = " << x << endl; #endif
Se prima l'istruzione #ifdef DEBUG è stata definita simbolica DEBUG costante, sarà sul bilancio del programmaCERR compilati.È possibile utilizzare #if 0 commento fuori la parte istruzione del programma, come segue:
#if 0 不进行编译的代码 #endif
Proviamo i seguenti esempi:
#include <iostream> using namespace std; #define DEBUG #define MIN(a,b) (((a)<(b)) ? a : b) int main () { int i, j; i = 100; j = 30; #ifdef DEBUG cerr <<"Trace: Inside main function" << endl; #endif #if 0 /* 这是注释部分 */ cout << MKSTR(HELLO C++) << endl; #endif cout <<"The minimum is " << MIN(i, j) << endl; #ifdef DEBUG cerr <<"Trace: Coming out of main function" << endl; #endif return 0; }
Quando il codice di cui sopra è compilato ed eseguito, produce i seguenti risultati:
Trace: Inside main function The minimum is 30 Trace: Coming out of main function
# ## E operatore di pre-elaborazione in C ++ e ANSI / ISO C in esso è disponibile. # Operatore di token di sostituzione-testo sarà convertito in una stringa racchiusa tra virgolette.
Si consideri la seguente definizione di macro:
#include <iostream> using namespace std; #define MKSTR( x ) #x int main () { cout << MKSTR(HELLO C++) << endl; return 0; }
Quando il codice di cui sopra è compilato ed eseguito, produce i seguenti risultati:
HELLO C++
Vediamo come funziona. Comprensibilmente, C ++ preprocessore la seguente riga:
cout << MKSTR(HELLO C++) << endl;
Convertito in:
cout << "HELLO C++" << endl;
## Gli operatori sono utilizzati per collegare due token. Ecco un esempio:
#define CONCAT( x, y ) x ## y
Quando CONCAT compare nel programma, i suoi parametri saranno collegati e utilizzati per sostituire la macro. Per esempio, il programma di CONCAT (CIAO, C ++) è sostituito da "CIAO C ++", come mostrato negli esempi seguenti.
#include <iostream> using namespace std; #define concat(a, b) a ## b int main() { int xy = 100; cout << concat(x, y); return 0; }
Quando il codice di cui sopra è compilato ed eseguito, produce i seguenti risultati:
100
Vediamo come funziona. Comprensibilmente, C ++ preprocessore la seguente riga:
cout << concat(x, y);
Convertito in:
cout << xy;
C ++ è previsto nella tabella di seguito alcune macro predefinite:
宏 | 描述 |
---|---|
__LINE__ | 这会在程序编译时包含当前行号。 |
__FILE__ | 这会在程序编译时包含当前文件名。 |
__DATE__ | 这会包含一个形式为 month/day/year 的字符串,它表示把源文件转换为目标代码的日期。 |
__TIME__ | 这会包含一个形式为 hour:minute:second 的字符串,它表示程序被编译的时间。 |
Vediamo queste macro esempi:
#include <iostream> using namespace std; int main () { cout << "Value of __LINE__ : " << __LINE__ << endl; cout << "Value of __FILE__ : " << __FILE__ << endl; cout << "Value of __DATE__ : " << __DATE__ << endl; cout << "Value of __TIME__ : " << __TIME__ << endl; return 0; }
Quando il codice di cui sopra è compilato ed eseguito, produce i seguenti risultati:
Value of __LINE__ : 6 Value of __FILE__ : test.cpp Value of __DATE__ : Feb 28 2011 Value of __TIME__ : 18:52:48