Udostępnij za pośrednictwem


Dyrektyw # if, #elif, # else i # ENDIF (C/C++)

#if Dyrektywa z #elif, #else, i #endif dyrektyw, kompilacja kontroli części pliku źródłowego.Jeśli wyrażenie zapisu (po #if) ma wartość różną od zera, grupa linii bezpośrednio po #if dyrektywy jest zachowywana w jednostce tłumaczenia.

Gramatyka

  • warunkowe :
    Jeśli część elif częścioptelse częśćoptendif linii

  • Jeśli część :
    Jeśli wiersz tekstu

  • Jeśli linia :
    # if wyrażenie stała

    # ifdef identyfikator

    #ifndef identyfikator

  • części elif :
    elif wiersza tekstu

    elif części elif wiersz tekstu

  • Linia elif :
    #elif wyrażenie stała

  • else część :
    else wiersza tekstu

  • else linii :
    #else

  • endif linii :
    #endif

Każdy #if dyrektywy w pliku źródłowym musi towarzyszyć zamknięcia #endif dyrektywy.Dowolna liczba #elif dyrektywy mogą być wyświetlane między #if i #endif dyrektyw, ale co najwyżej jeden #else dyrektywy jest dozwolone.#else Dyrektywy, jeśli jest obecny, musi być ostatnim dyrektywy przed #endif.

#if, #elif, #else, I #endif dyrektyw można zagnieździć w innych fragmentów tekstu #if dyrektyw.Każdy zagnieżdżone #else, #elif, lub #endif dyrektywy należy do najbliższego poprzedzających #if dyrektywy.

Wszystkich dyrektyw warunkowych kompilacji, takie jak #if i # ifdef, muszą być dopasowane z zamknięcia #endif dyrektyw przed końcem pliku; w przeciwnym razie jest generowany jest komunikat o błędzie.Gdy dyrektyw warunkowych kompilacji są zawarte w plikach include, muszą spełniać warunki tej samej: nie niedopasowane dyrektyw warunkowych kompilacji na końcu pliku dołączanego musi być.

Zastąpienie makro jest wykonywane w ramach część wiersza polecenia, który następuje #elif polecenia, aby można było używać wywołania makra w wyrażenie stała.

Preprocesora wybiera jeden z danego wystąpienia tekst do dalszego przetwarzania.Blok, określone w tekst może być dowolną sekwencją tekstu.Można go zajmują więcej niż jeden wiersz.Zazwyczaj tekst jest tekst program, który ma znaczenie kompilator lub preprocesora.

Preprocesora przetwarza wybranego tekst i przekazuje ją do kompilatora.Jeśli tekst zawiera dyrektywy preprocesora preprocesora wykonuje tych dyrektyw.Są kompilowane wyłącznie bloków tekstu, wybrane przez preprocesora.

Preprocesora zaznacza pojedynczy tekst element poprzez ocenę wyrażenie stałe, po każdym #if lub #elif dyrektywy aż do znalezienia true wyrażenie stałe (niezerowej).To zaznacza cały tekst (łącznie z innych dyrektyw preprocesora, począwszy od #) aż do jego skojarzony #elif, #else, lub #endif.

Jeśli wszystkie wystąpienia wyrażenie stała są fałszywe, lub jeśli nie #elif pojawiają się dyrektyw, preprocesora zaznacza blok tekstu, po #else klauzuli.Jeśli #else klauzuli zostanie pominięty i wszystkie wystąpienia wyrażenie stała w #if bloku są fałszywe, bloku tekstu, nie jest zaznaczone.

Wyrażenie stała jest stałą wyrażenie liczby całkowitej z tych dodatkowych ograniczeń:

  • Wyrażenia muszą mieć typ integralną i może zawierać tylko całkowitą stałych, stałe znaków i zdefiniowane operatora.

  • Nie można użyć wyrażenia sizeof lub operatora rzutowania typu.

  • Środowiska docelowego może okazać się niemożliwe do reprezentowania wszystkich zakresów liczb całkowitych.

  • Tłumaczenie reprezentuje typ int taki sam, jak typ long, i unsigned int taki sam, jak unsigned long.

  • Translator można tłumaczyć stałych znaków do zestawu wartości kodów różnych z zestawu dla środowiska docelowego.Aby określić właściwości środowiska docelowego, należy sprawdzić wartości makra od limitów.H w aplikacji utworzonej dla środowiska docelowego.

  • Wyrażenie nie może wykonać wszystkie zapytania środowiska i muszą pozostać izolowane od szczegóły implementacji na komputerze docelowym.

Operator preprocesora zdefiniowane mogą być używane w specjalnych wyrażeń stałych, jak pokazano w następującej składni:

defined( identifier )

definicjaidentifier

To wyrażenie stałe jest uważany za true (niezerowej), jeśli identyfikatora jest obecnie zdefiniowana; w przeciwnym razie warunek ma wartość false (0).Identyfikator zdefiniowany jako pusty tekst uważana jest zdefiniowana.Zdefiniowane dyrektywy mogą być używane w #if i #elif dyrektywy, ale nigdzie else.

W poniższym przykładzie #if i #endif dyrektyw kontroli kompilacji jednego z trzech wywołań funkcji:

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

Wywołanie funkcji credit jest kompilowany, jeśli identyfikator CREDIT jest zdefiniowany.Jeśli identyfikator DEBIT jest zdefiniowany, wywołanie funkcji debit jest kompilowana.Jeśli zdefiniowano ani identyfikatora, wywołanie do printerror jest kompilowana.Należy zauważyć, że CREDIT i credit są różne identyfikatory w c i C++, ponieważ ich przypadkach są różne.

Instrukcje kompilacji warunkowej w poniższym przykładzie założono, wcześniej zdefiniowanych stałą symboliczną o nazwie 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

Pierwszy #if blok zawiera dwa zestawy zagnieżdżonych #if, #else, i #endif dyrektyw.Pierwszy zestaw dyrektyw jest przetwarzany tylko wtedy, gdy DLEVEL > 5 ma wartość true.W przeciwnym razie oświadczenia po #else są przetwarzane.

#elif i #else dyrektyw w drugim przykładzie są wykorzystywane do wytwarzania jednego z czterech możliwości, na podstawie wartości z DLEVEL.Stała STACK jest ustawiony na 0, 100 lub 200, w zależności od definicji DLEVEL.Jeśli DLEVEL jest większa niż 5, a następnie instrukcji

#elif DLEVEL > 5
display(debugptr);

jest skompilowany i STACK nie jest zdefiniowany.

Częstym zastosowaniem kompilacji warunkowej jest uniemożliwienie wielu dołączeń tego samego pliku nagłówka.W języku C++, gdzie klas często są zdefiniowane w plikach nagłówkowych, konstrukcje następującego może służyć do zapobieżenia wiele definicji:

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

class Example
{
...
};

#endif // !defined( EXAMPLE_H )

Powyższy kod sprawdza, jeśli stała symboliczne EXAMPLE_H jest zdefiniowany.Jeśli tak, plik został już dołączony i nie muszą ponownie przetwarzany.Jeśli nie, stała EXAMPLE_H jest zdefiniowany, aby oznaczyć przykład.H, jak już przetwarzane.

Zobacz też

Informacje

Dyrektywy preprocesora