DODATEK A PRZEWODNIK JĘZYKA C_____
wiersz-elif:
# elit wyraienie-stałe
część-else:
wiersz-else tekst
wiersz-else:
# else
Każdy z takich wierszy preprocesora (wiersz-if\ wiersz-elif\ wiersz-else i wiersz zawierający #endif) pojawia się w oddzielnym wierszu programu. Wyrażenia stale, występujące w #if i w następujących #elif, są obliczane kolejno, aż do napotkania wyrażenia z niezerową wartością. Tekst następujący po takich wierszach z zerową wartością opuszcza się. Tekst następujący po takim wierszu z „pozytywną” wartością wyrażenia jest włączany do programu. Przez „tekst” rozumie się tutaj dowolny materiał, łącznie z tymi wierszami preprocesora, które nie są częścią danej konstrukcji warunkowej; tekst ten może być pusty. Jeśli już znaleziono „pozytywny” wiersz #if lub #elif i obsłużono jego tekst, to kolejne wiersze #elif i #else wraz z ich tekstami są pomijane. Jeśli wszystkie wyrażenia są równe zero i występuje wiersz #else, to obsługuje się tekst następujący po #else. Tekst kontrolowany przez nieaktywne (negatywne) ramiona konstrukcji warunkowej ignoruje się, ale przegląda w poszukiwaniu zagnieżdżonych konstrukcji warunkowych.
Wyrażenia stałe występujące w #if i #elif są przedmiotem zwykłych makrorozwinięć. Ponadto, każde wyrażenie mające postać
defined identyfikator
lub
defined ( identyfikator )
przed rozwijaniem makr zastępuje się przez 1L-jeśli identyfikator jest zdefiniowany w preprocesorze, lub przez OL - jeśli nie jest. Wszystkie identyfikatory pozostałe w takim wyrażeniu po makrorozwinięciach zastępuje się przez OL. Na koniec, wszystkie stałe całkowite traktuje się tak, jakby miały przyrostek L, zatem całą arytmetykę przeprowadza się na liczbach długich lub długich bez znaku.
Wynikowe wyrażenie stałe (p. A7.19) ma ograniczenia: musi być całkowite i nie może zawierać operatora sizeof, rzutowania i stałych wyliczeń.
Wiersze sterujące o postaci
#ifdef identyfikator #ifndef identyfikator
A12 PREPROCESOR
odpowiadają wierszom
# if defined identyfikator
# if! defined identyfikator
Wiersz sterujący #elif nie występował w pierwszym wydaniu, chociaż był dostępny w kilku preprocesorach. Operator preprocesora defined jest także nowy.
Dla potrzeb innych preprocesorów, które generują programy w języku C, wiersz mają-cy jedną z postaci
# linę stała "nazwa-pliku"
# linę stała
zleca kompilatorowi, aby dla celów diagnostycznych przyjął, że następny źródłowy wiersz będzie miał numer podany stałą, a nazwą bieżącego pliku źródłowego będzie nazwa-pliku. Jeśli pominięto nazwę pliku (wraz ze znakami cudzysłowu), to pamiętana poprzednia nazwa pliku pozostanie nie zmieniona. Makra występujące w takich wierszach są rozwijane przed interpretacją instrukcji.
Wiersz sterujący o postaci
# error ciąg-leksemówopc
zleca preprocesorowi wypisanie komunikatu diagnostycznego zawierającego podany ciąg leksemów.
Wiersz sterujący o postaci
# pragma ciqg-leksemówopc
zleca preprocesorowi podjęcie akcji zależnej od implementacji. Nieznana akcja jest ignorowana.
311