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.
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.
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.
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