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 liniiJeśli część :
Jeśli wiersz tekstuJeśli linia :
# if wyrażenie stała# ifdef identyfikator
#ifndef identyfikator
części elif :
elif wiersza tekstuelif części elif wiersz tekstu
Linia elif :
#elif wyrażenie stałaelse część :
else wiersza tekstuelse linii :
#elseendif 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.