Latest web development tutorials

C ++ preprocessore

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.

pre-elaborazione #define

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

...
int main ()
{
 
    cout << "Value of PI :" << 3.14159 << endl; 

    return 0;
}

Funzioni macro

È 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

compilazione condizionale

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 ## operatori

# ## 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 ++ macro predefinite

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