Sdílet prostřednictvím


Direktivy # if, #elif, # else a #endif (C/C++)

#if Směrnice se #elif, #else, a #endif směrnic řídí sestavování částí zdrojového souboru.Pokud zapíšete výraz (po #if) má nenulovou hodnotu řádku skupiny bezprostředně následující #if směrnice je zachována v jednotce překlad.

Gramatika

  • Podmíněné :
    Pokud část dílů elifoptjinak částoptendif řádku

  • Pokud část :
    Pokud řádek textu

  • Pokud řádek :
    # IF konstantní výraz

    #ifdef identifikátor

    #ifndef identifikátor

  • části elif :
    elif řádek textu

    elif částí elif řádek textu

  • řádek elif :
    #elif konstantní výraz

  • ostatní části :
    jiný řádek textu

  • jiný řádek :
    #else

  • řádek endif :
    #endif

Každý #if směrnice ve zdrojovém souboru musí být porovnávána uzávěrky #endif směrnice.Libovolný počet #elif směrnic mohou objevit mezi #if a #endif směrnic, ale nejvýše jednu #else směrnice je povoleno.#else Směrnice, pokud je k dispozici, musí být poslední směrnice před #endif.

#if, #elif, #else, A #endif směrnic můžete vnořit do jiné části textu #if směrnic.Každý vnořený #else, #elif, nebo #endif směrnice patří k nejbližší předcházející #if směrnice.

Všechny podmíněné kompilace směrnic, jako například #if a #ifdef, musí odpovídat uzávěrky #endif směrnic před koncem souboru; jinak je generována chybová zpráva.Zahrnout soubory jsou součástí podmíněné kompilace směrnic, musí splňovat stejné podmínky: musí být žádné neporovnané směrnic podmíněné kompilace na konci souboru zahrnout.

Náhradní makra se provádí v rámci části příkazového řádku, který následuje #elif proto volání makra lze v příkazu konstantní výraz.

Preprocesoru vybere jeden z dané výskyty textu pro další zpracování.V bloku textu může být libovolná posloupnost textu.To zabírat více než jeden řádek.Obvykle textu je program text, který má význam pro kompilátor nebo preprocesoru.

Zpracuje vybrané preprocesoru textu a předá kompilátoru.Pokud textu obsahuje direktivy předprocesoru preprocesoru provádí těchto směrnic.Textové bloky, vybrané preprocesoru jsou kompilovány.

Preprocesoru vybere jeden textu položku vyhodnocením konstantní výraz po každé #if nebo #elif směrnice, dokud nenajde true (nenulové) konstantní výraz.Jej vybere všechen text (včetně jiných direktivy předprocesoru, počínaje #) až do jeho přidružený #elif, #else, nebo #endif.

Pokud všechny výskyty konstantní výraz jsou nepravdivé, nebo pokud žádný #elif směrnic se zobrazí, vybere preprocesoru blok textu po #else klauzule.Pokud #else klauzule je vynechán a všechny instance konstantní výraz v #if bloku jsou NEPRAVDA, je-li vybrán žádný textový blok.

Konstantní výraz je konstantní výraz celé číslo s tato další omezení:

  • Výrazy musí být integrálního typu a mohou obsahovat pouze celé číslo konstanty, znak konstanty a definované operátor.

  • Výraz nelze použít sizeof nebo operátoru přetypování typu.

  • Cílové prostředí není možné představují všechny rozsahy celých čísel.

  • Překlad představuje typ int stejné jako typ dlouhý, a unsigned int stejné jako unsigned long.

  • Překladač lze překládat konstanty znakové sady hodnot kódu liší od nastavení pro cílové prostředí.Chcete-li určit vlastnosti cílové prostředí, zkontrolujte hodnoty makra z limitů.H v aplikaci pro cílové prostředí.

  • Výraz musí provést všechny dotazy životního prostředí a musí zůstat izolované od podrobnosti implementace v cílovém počítači.

Preprocesoru operátor definované lze použít zvláštní konstantní výrazy, jak ukazují následující syntaxi:

defined( identifier )

definiceidentifier

Tato konstanta je považován za hodnotu true (nenulové), pokud identifikátor aktuálně definované; jinak je podmínka NEPRAVDA (0).Identifikátor definován považuje prázdné textové definice.Definované směrnice lze v #if a #elif směrnice, ale nikde jinde.

V následujícím příkladu #if a #endif směrnic řízení kompilace tři volání funkce:

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

Volání funkce credit je zkompilován Pokud identifikátor CREDIT je definován.Pokud identifikátor DEBIT je definován volání funkce debit je kompilován.Pokud je definován žádný identifikátor, volání printerror je kompilován.Všimněte si, že CREDIT a credit jsou odlišné identifikátory v c a C++, protože jejich případech liší.

Příkazy podmíněné kompilace v následujícím příkladu předpokládejme dříve definované Symbolická konstanta s názvem 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

První #if bloku zobrazí dvě sady vnořené #if, #else, a #endif směrnic.První sada směrnic zpracovávána, pouze pokud DLEVEL > 5 je PRAVDA.Jinak příkazy po #jinak jsou zpracovány.

#elif a #else směrnic v druhém příkladu jsou použity na jeden ze čtyř voleb, na základě hodnoty DLEVEL.Konstanta STACK je nastavena na 0, 100 nebo 200, v závislosti na definici DLEVEL.Pokud DLEVEL je větší než 5, potom příkaz

#elif DLEVEL > 5
display(debugptr);

je zkompilován a STACK není definována.

Běžné použití pro podmíněné kompilace je zabránit zahrnutí více stejných záhlaví souboru.V jazyce C++, kde jsou často definovány třídy v záhlaví souborů, lze použít následující konstrukce zabránit více definic:

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

class Example
{
...
};

#endif // !defined( EXAMPLE_H )

Předcházející kód zkontroluje, zda Symbolická konstanta EXAMPLE_H je definován.Pokud ano, soubor je již zahrnut a nutné přepracován.Pokud není, konstanta EXAMPLE_H je definován například označit.H jak již zpracovány.

Viz také

Referenční dokumentace

Direktivy preprocesoru