ANSI C 2

ANSI C 2



uuum i łk A PHZŁWODNIK JĘZYKA C

99 = • •

#

??( [

??<

{

??/

\

??) j

??>

}

991

• •

??! 1

??-

Żadne inne podobne zastąpienia nie występują.

Trzyznakowe sekwencje pojawiły się wraz z ANSI C.

A12.2 Sklejanie wierszy

Wiersze, które kończą się znakiem \, łączy się z następnym wierszem przez usunięcie znaku \ i następującego po nim znaku nowego wiersza. Odbywa się to przed podziałem programu na leksemy.

A12.3 Definicje i rozwinięcia makr

Wiersz sterujący o postaci

#    define identyfikator ciąg-leksemów

zleca preprocesorowi zastępowanie dalszych wystąpień identyfikatora wskazanym ciągiem leksemów; opuszcza się odstępy otaczające ciąg leksemów. Ponowne wystąpienie #define z tym samym identyfikatorem traktuje się jako błędne, jeżeli ciągi leksemów nie są w obu przypadkach identyczne (przy czym wszystkie białe plamy rozdzielające leksemy traktuje się jako równoważne).

Wiersz o postaci

#    define identyfikator ( lista-identyfikatorów ) ciąg-leksemów

w którym między pierwszym identyfikatorem a nawiasem otwierającym nie ma odstępu, jest makrodefinicją z parametrami podanymi na liście identyfikatorów. Podobnie jak w poprzednim przypadku, opuszcza się odstępy otaczające ciąg leksemów, a makro może być ponownie zdefiniowane, jeśli w obu definicjach liczba i pisownia parametrów oraz ciągi leksemów są identyczne.

Wiersz sterujący o postaci

#    undef identyfikator

zleca preprocesorowi, aby zapomniał definicję identyfikatora. Zastosowanie #undef do nie zdefiniowanego identyfikatora nie jest błędem.

Mi siol

powered by


A12 preprocesor


Jeśli makro zdefiniowano za pomocą drugiej formy #define. to kal stąpienie identyfikatora makra, po którym następują: nawias otwierający (ewentualnie poprzedzony odstępem), ciągi leksemów rozdzielone przecinkami i nawias zamykający, jest wywołaniem makra. Argumentami wywołania makra są ciągi leksemów rozdzielone przecinkami; przecinki zawarte w apostrofach i cudzysłowach oraz chronione przez zagnieżdżone nawiasy nie dzielą argumentów. Podczas kompletowania argumentów występujące w nich makra nie są rozwijane. Liczba argumentów w wywołaniu musi być taka sama, jak liczba parametrów w definicji. Po wyizolowaniu argumentów usuwa się z nich otaczające je odstępy. Następnie, w ciągu leksemów tworzącym makrodefinicję każde wystąpienia identyfikatora parametru - oprócz tych, które są zawarte w cudzysłowach i apostrofach - jest zastępowane wynikowym ciągiem leksemów odpowiedniego argumentu. Jeśli występujący w ciągu leksemów parametr nie jest poprzedzony znakiem # lub nie występuje przed nim lub po nim operator ##, to leksemy argumentu przegląda się w poszukiwaniu innych makrowywołari i rozwija, gdy trzeba, tuż przed zastąpieniem.

Dwa specjalne operatory wpływają na proces rozwijania makr. Po pierwsze, jeżeli w zastępującym ciągu leksemów wystąpienie parametru jest bezpośrednio poprzedzone znakiem #, to identyfikator parametru wraz ze znakiem # zostaną zastąpione odpowiednim argumentem otoczonym znakami cudzysłowu (”). Każdy ze znaków i \ występujący na początku, w środku lub na końcu w stałych znakowych i napisach tworzących argument zostanie poprzedzony znakiem \.

Po drugie, gdy w ciągu leksemów tworzącym definicję makra o dowolnej postaci wystąpi operator ##, wówczas - tuż po zastąpieniu parametrów - operator ten wraz z otaczającymi go białymi plamami zostanie usunięty. Powoduje to sklejenie sąsiadujących leksemów i utworzenie nowego leksemu. Jeśli tak utworzony lekscm jest niepoprawny lub jeśli jest istotna kolejność wykonywania operatorów ##, to skutek całej operacji nie jest zdefiniowany. Ponadto operator ## nie może wystąpić ani na początku, ani na końcu zastępującego ciągu leksemó\y.

Niezależnie od postaci makrodcfinicji zastępujący ciąg leksemów jest wielokrotnie przeglądany w poszukiwaniu innych tak zdefiniowanych identyfikatorów. Jeżeli jednak identyfikator, zastąpiony już w danym rozwinięciu, znów pojawi się przy ponownym przeglądaniu, to pozostanie w rozwiniętym tekście bez zmiany.

Wynik makrorozwinięcia rozpoczynający się znakiem # nie jest traktowany jak instrukcja preprocesora.

Szczegóły procesu rozwijania makr są w ANSI C opisane dokładniej niż w pierwszym wydaniu książki. Najistotniejszą zmianą jest dodanie operatorów # i ##, które umożliwiają otaczanie tekstu znakami cudzysłowu i sklejanie napisów. Pewne nowe zasady, szczególnie te, które dotyczą sklejania napisów, są dziwaczne (patrz przykład przy końcu tego punktu).

307


Wyszukiwarka

Podobne podstrony:
ANSI C 2 1 ELEMENTARZ W naszym przykładzie występuje sekwencja

ANSI C 2 DODATEK A PRZEWODNIK JĘZYKA C W pierwszym wydaniu książki typ wyrażenia przyrostkowego by
ANSI C 2 DODATEK A PRZEWODNIK JĘZYKA CA8.6 Znaczenie deklaratorów Lista deklaratorów pojawia się p
ANSI C 2 1 ELEMENTARZ 1 ELEMENTARZ ’

ANSI C 2 2 TYPY, OPERATORY I WYRAŻENIA_____— kiej zmiennej, jest poprawną wartością wyliczenia. Zm
ANSI C 2 3 STEROWANIE Dwuznaczność la jest szczególnie szkodliwa w sytuacjach podobnych do tej:
ANSI C 2 4 FUNKCJE I STRUKTURA PROGRAMU Deklaracja double sum, atof(char[ ]); mówi, że zmienna sum
ANSI C 2 4 FUNKCJE I STRUKTURA PROGRAMU Jeśli wstawiany plik zostanie zmieniony, to naturalnie wsz
ANSI C 2 5 WSKAŹNIKI I TABLICE _______^ operator przyrostkowy ++ nie zmieni t, dopóki nie zostanie
ANSI C 2 5 WSKAŹNIKI I TABLICE _______—— Ćwiczenie 5.16. Dodaj opcję -d (kolejność słownikowa) spr
ANSI C 2 6 STRUKTURY Warto tutaj omówić kilka spraw. Po pierwsze, deklaracja funkcji binsearch mus
ANSI C 2 7 WEJŚCIE I WYJŚCIE_______- kretnej maszynie, programom z nich korzystającym oszczędzono
ANSI C 2 0    onuuuvvi5Tu 3Y5I CIVHJ UNIA____________ całą komunikację programu z u
ANSI C 2 położenia w pamięci wszystkie bloki mają rozmiar będący wielokrotnością rozmiaru nagłówka
ANSI C 2 DODATEK B BIBLIOTEKA STANDARDOWA Tablica B-1. Przekształcenia funkcji printf Znak Typ
ANSI C 2 DODATEK C PODSUMOWANIE ZMIAN ków # ~ [] { }
KLUB MĄDREGO SZEŚCIOLATKA 1 2 99 ► Który bohater byt z drewna? 100 ► Które zwierzą to ośmiornica?

więcej podobnych podstron