Direttive #if, #elif, #else e #endif

Direttive del preprocessore che controllano la compilazione di parti di un file di origine.

#if ifCondition ...
[#elif elifCondition ...]
[#else ...]
#endif

Parametri

Elemento Descrizione
ifCondition
Condizione primaria da valutare. Se questo parametro restituisce un valore diverso da zero, tutto il testo tra questa direttiva #if e l'istanza successiva del #elif, #else o #endif direttiva viene mantenuta nell'unità di traduzione; in caso contrario, il codice sorgente successivo non viene mantenuto.
La condizione può usare l'operatore preprocessore definito per determinare se è definita una costante o una macro del preprocessore specifico; questo utilizzo equivale all'uso della direttiva #ifdef .
Vedere la sezione Osservazioni per le restrizioni sul valore del parametro ifCondition .
elifCondition [facoltativo]
Altra condizione da valutare. Se il parametro ifCondition e tutte le direttive di #elif precedenti restituisce zero e questo parametro restituisce un valore diverso da zero, tutto il testo tra questa direttiva #elif e l'istanza successiva del #elif, #else o #endif direttiva viene mantenuta nell'unità di traduzione; in caso contrario, il codice sorgente successivo non viene mantenuto.
La condizione può usare l'operatore preprocessore definito per determinare se è definita una costante o una macro del preprocessore specifico; questo utilizzo equivale all'uso della direttiva #ifdef .
Vedere la sezione Osservazioni per le restrizioni sul valore del parametro elifCondition .

Commenti

Ogni direttiva #if in un file di origine deve essere corrispondente a una direttiva di chiusura #endif. Qualsiasi numero di direttive #elif può essere visualizzato tra le direttive #if e #endif, ma al massimo una direttiva #else è consentita. La direttiva #else, se presente, deve essere l'ultima direttiva prima di #endif. Le direttive di compilazione condizionale contenute in includono file devono soddisfare le stesse condizioni.

Le direttive #if, #elif, #else e #endif possono annidare nelle parti di testo di altre direttive #if. Ogni direttiva #else annidata, #elif o #endif appartiene alla direttiva #if precedente più vicina.

Se nessuna condizione restituisce un valore diverso da zero, il preprocessore seleziona il blocco di testo dopo la direttiva #else. Se la clausola #else viene omessa e nessuna condizione restituisce un valore diverso da zero, non viene selezionato alcun blocco di testo.

I parametri ifCondition e elifCondition soddisfano molto i requisiti seguenti:

  • Le espressioni di compilazione condizionale vengono considerate come valori lunghi firmati e queste espressioni vengono valutate usando le stesse regole delle espressioni in C++.
  • Le espressioni devono disporre di un tipo integrale e possono includere solo costanti Integer, costanti carattere e l'operatore defined.
  • Le espressioni non possono usare sizeof o un operatore type-cast.
  • È possibile che l'ambiente di destinazione non sia in grado di rappresentare tutti gli intervalli di Integer.
  • La traduzione rappresenta il tipo int uguale al tipo long e non firmato int uguale a unsigned long.
  • Il convertitore può traslare le costanti carattere in un set di valori di codice diverso dal set per l'ambiente di destinazione. Per determinare le proprietà dell'ambiente di destinazione, verificare i valori delle macro da LIMITS.H in un'applicazione sviluppata per l'ambiente di destinazione.
  • L'espressione non deve eseguire alcuna analisi di ambiente e deve rimanere isolata dai dettagli di implementazione nel computer di destinazione.

Esempio

Questa sezione contiene esempi che illustrano come usare le direttive del preprocessore di compilazione condizionale.

Uso dell'operatore definito

Nell'esempio seguente viene illustrato l'uso dell'operatore definito. Se l'identificatore CREDIT è definito, viene compilata la chiamata alla funzione di credito . Se l'identificatore DEBIT è definito, la chiamata alla funzione di debito viene compilata. Se non viene definito alcun identificatore, la chiamata alla funzione printerror viene compilata. Si noti che "CREDIT" e "credit" sono identificatori distinti in C e C++ perché i relativi casi sono diversi.

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

Uso delle direttive di #if annidate

Nell'esempio seguente viene illustrato come annidare le direttive #if. In questo esempio si presuppone che sia stata definita in precedenza una costante simbolica denominata DLEVEL. Le direttive #elif e #else vengono usate per effettuare una delle quattro scelte, in base al valore di DLEVEL. La costante STACK è impostata su 0, 100 o 200, a seconda della definizione di DLEVEL. Se DLEVEL è maggiore di 5, STACK non è definito.

#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

Usare per includere i file di intestazione

Generalmente la compilazione condizionale viene utilizzata per evitare più inclusioni dello stesso file di intestazione. In C++, dove le classi sono spesso definite nei file di intestazione, è possibile usare costrutti di compilazione condizionale per impedire più definizioni. L'esempio seguente determina se è definita la costante simbolica EXAMPLE_H. In tal caso, il file è già stato incluso e non deve essere riprocessato; in caso contrario, la costante EXAMPLE_H è definita per indicare che EXAMPLE. H è già stato elaborato.

#if !defined( EXAMPLE_H )
#define EXAMPLE_H

class Example
{
...
};

#endif // !defined( EXAMPLE_H )

Vedi anche

Direttive preprocessore (DirectX HLSL)