Condividi tramite


#if, #elif, #else e direttive di #endif (C/C++)

#if direttiva, con #elif, #elsee #endif direttive, compilazione dei controlli di parti di file di origine.Se l'espressione di scrivere le modifiche #ifpresenta un valore diverso da zero, il gruppo di riga immediatamente dopo il #if la direttiva viene mantenuta nell'unità di conversione.

Grammatica

  • condizionale :
    elif-parti di se-partesceglierealtro-partescegliereendif-linea

  • se-parte :
    testo della se-linea

  • se-linea :
    blocchi #if espressione costante

    #ifdef identificatore

    #ifndef identificatore

  • elif-parti :
    testo della elif-linea

    testo della elif-linea di elif-parti

  • elif-linea :
    #elif espressione costante

  • altro-parte :
    testo della altro-linea

  • altro-linea :
    #else

  • endif-linea :
    #endif

ciascuno #if la direttiva in un file di origine deve essere una corrispondenza con un chiusura #endif direttiva.qualsiasi numero #elif le direttive possono essere visualizzati tra #if e #endif direttive, ma al massimo una #else la direttiva è consentita.#else la direttiva, se presente, deve essere l'ultima direttiva prima #endif.

#if, #elif, #elsee #endif le direttive possono essere annidati in parti di testo di un'altra #if direttive.ciascuno annidato #else, #elif, o #endif la direttiva appartiene a essere più vicino #if direttiva.

Tutte le direttive di compilazione condizionale, ad esempio #if e #ifdef, deve corrispondere alla chiusura #endif direttive prima della fine di un file; in caso contrario, viene visualizzato un messaggio di errore viene generato.quando le direttive di compilazione condizionale sono contenute in file di inclusione, devono soddisfare le stesse condizioni: Non devono essere direttive non corrispondenti di compilazione condizionale alla fine del file di inclusione.

La macro sostituzione viene eseguito nella parte della riga di comando che segue #elif ordinare, pertanto una chiamata di macro può essere utilizzata in espressione costante.

Il preprocessore selezionare una delle occorrenze specificate di testo per ulteriori elaborazioni.Un blocco specificato in testo può essere qualsiasi sequenza di testo.Può occupare più di uno riga.In genere testo è il testo di programma con significato al compilatore o al preprocessore.

il preprocessore elabora selezionato testo e passa al compilatore.se testo contiene direttive per il preprocessore, il preprocessore effettua le direttive.Solo i blocchi di testo selezionati dal preprocessore vengono compilati.

il preprocessore seleziona un singolo testo elemento valutare l'espressione costante che segue ognuno #if o #elif direttiva finché non rileva un'espressione costante (diversa da zero) true.Selezionare tutto il testo (altre direttive per il preprocessore incluse a partire da #) fino al relativo associato #elif, #else, o #endif.

se tutte le occorrenze di espressione costante essere false, o se non #elif le direttive sono visualizzate, il preprocessore selezionare il blocco di testo dopo #else clausola.se #else la clausola viene omessa e tutte le istanze di espressione costante in #if il blocco è false, nessun blocco di testo selezionato.

espressione costante è un'espressione costante Integer con queste restrizioni aggiuntive:

  • Le espressioni devono avere un tipo integrale e possono includere solo le costanti Integer, costanti carattere e definito operatore.

  • l'espressione non può utilizzare sizeof o un operatore di cast di tipo.

  • L'ambiente di destinazione non è in grado di rappresentare tutti gli intervalli di Integer.

  • la conversione rappresenta il tipo int lo stesso oggetto di tipo tempoe unsigned int lo equivale a unsigned long.

  • Il convertitore può equivalere le costanti carattere a un set di valori di codice diversi dal set per l'ambiente di destinazione.Per determinare le proprietà dell'ambiente di destinazione, valori del controllo delle macro da LIMITS.H in un'applicazione sviluppata di ambiente di destinazione.

  • L'espressione non è necessario eseguire alcuna analisi ambiente e deve rimanere isolata dai dettagli di implementazione nel computer di destinazione.

L'operatore del preprocessore definito può essere utilizzato in espressioni costanti speciali, come illustrato nella seguente sintassi:

definito ( identifier )

definito identifier

Questa espressione costante è considerata true (diverso da zero) identificatore è attualmente definito; in caso contrario, la condizione è false (0).Un identificatore definito come testo vuoto viene considerato definito.definito la direttiva può essere utilizzata in #if e #elif direttiva, ma da nessun'altra parte.

Nell'esempio seguente, #if e #endif una compilazione del controllo di direttive di una delle chiamate a tre funzioni:

#if defined(CREDIT)
    credit();
#elif defined(DEBIT)
    debit();
#else
    printerror();
#endif

la chiamata di funzione a credit viene compilato se l'identificatore CREDIT è definito.se l'identificatore DEBIT è definita, la chiamata di funzione a debit viene compilato.Se nessuna delle due identificatore definito, la chiamata a printerror viene compilato.si noti che CREDIT e credit sono identificatori univoci in c# e C++ perché i casi sono diversi.

Le istruzioni di compilazione condizionale nell'esempio si presuppone una costante simbolica definiti in precedenza denominata DLEVEL.

#if DLEVEL > 5
    #define SIGNAL  1
    #if STACKUSE == 1
        #define STACK   200
    #else
        #define STACK   100
    #endif
#else
    #define SIGNAL  0
    #if STACKUSE == 1
        #define STACK   100
    #else
        #define STACK   50
    #endif
#endif
#if DLEVEL == 0
    #define STACK 0
#elif DLEVEL == 1
    #define STACK 100
#elif DLEVEL > 5
    display( debugptr );
#else
    #define STACK 200
#endif

il primo #if il blocco consente due set di annidato #if, #elsee #endif direttive.Primo set delle direttive viene elaborato solo se DLEVEL > 5 è true.In caso contrario, le istruzioni dopo #in caso contrario vengono elaborati.

#elif e #else le direttive nel secondo esempio vengono utilizzate per effettuare una delle quattro opzioni, in base al valore di DLEVEL.la costante STACK è impostato su 0, 100, o 200, come la definizione di DLEVEL.se DLEVEL è maggiore di 5, quindi l'istruzione

#elif DLEVEL > 5
display(debugptr);

viene compilato e STACK non è definito.

Un utilizzo comune di compilazione condizionale consente di evitare le inclusioni nello stesso file di intestazione.In C++, in cui le classi sono spesso definite nei file di intestazione, costrutti come l'esempio seguente può essere utilizzato per impedire più definizioni:

/*  EXAMPLE.H - Example header file  */
#if !defined( EXAMPLE_H )
#define EXAMPLE_H

class Example
{
...
};

#endif // !defined( EXAMPLE_H )

I controlli di codice precedenti per verificare se la costante simbolica EXAMPLE_H è definito.In caso affermativo, il file è già stato importato e non deve essere rielaboratoe.In caso contrario, la costante EXAMPLE_H viene definito contrassegnare EXAMPLE.H come già elaborato.

Vedere anche

Riferimenti

Direttive per il preprocessore