DODATEK A PRZEWODNIK JĘZYKA _______
6
Te zasady różnią się pod kilkoma względami od zasad opisanych w pierwszym wydaniu tego przewodnika. Poprzednio etykiety nie miały własnej przestrzeni nazw; etykietki struktur i unii, a w niektórych implementacjach również etykietki wyliczeń, należały do odrębnych przestrzeni nazw; włożenie różnego rodzaju etykietek do wspólnej przestrzeni jest nowym ograniczeniem. Najbardziej istotnym odejściem od reguł z pierwszego wydania jest zasada, żc każda struktura i unia tworzy oddzielną przestrzeń nazw dla swoich składowych, ta sama nazwa może więc wystąpić w kilku różnych strukturach. Tę zasadę powszechnie stosowano od wielu lat.
Leksykalny zasięg identyfikatora obiektu lub funkcji, występującego w deklaracji zewnętrznej, rozciąga się od końca jego deklaratora do końca jednostki tłumaczenia za-wierającej deklarację. Zasięg parametrów definicji funkcji rozpoczyna się z początkiem bloku definiującego tę funkcję i rozciąga na całą funkcję; zasięg parametru w deklaracji funkcji kończy się wraz z końcem deklaratora. Zasięg identyfikatora zadeklarowanego w nagłówku bloku rozciąga się od końca jego deklaratora do końca tego bloku. Zasięgiem etykiety jest cała zawierająca ją funkcja. Zasięg etykietki struktury, unii lub wyliczenia oraz stałej wyliczenia zaczyna się w miejscu jej wystąpienia w specyfikatorze typu i rozciąga na całą jednostkę tłumaczenia (dla deklaracji na poziomie zewnętrznym) lub do końca bloku (dla deklaracji wewnątrz funkcji).
Jawna deklaracja identyfikatora w nagłówku bloku, wliczając w to blok tworzący treść funkcji, zasłania aż do końca bloku wszystkie deklaracje tego samego identyfikatora podane na zewnątrz bloku.
Wszystkie deklaracje tego samego identyfikatora dla obiektu lub funkcji o łączności wewnętrznej odnoszą się do tej samej rzeczy w całej jednostce tłumaczenia i ten obiekt (lub funkcja) jest unikalny dla całej jednostki tłumaczenia. Wszystkie deklaracje tego samego identyfikatora dla obiektu lub funkcji o łączności zewnętrznej odnoszą się do tej samej rzeczy i ten obiekt (lub funkcja) jest współużywalny w całym programie.
Zgodnie z p. A 10.2, gdy pierwsza zewnętrzna deklaracja identyfikatora zawiera spe-cyfikator Static, wówczas nadaje ona identyfikatorowi łączność wewnętrzną; w pozostałych przypadkach identyfikator ma łączność zewnętrzną. Jeśli deklaracja identyfikatora wewnątrz bloku nie zawiera specyfikatora extern, to ten identyfikator nie ma łączności i jest unikalny w funkcji. Gdy ta deklaracja zawiera extern i gdy w zasięgu otaczającym blok obowiązuje zewnętrzna deklaracja tego samego identyfikatora, wówczas ten identyfikator ma taką samą łączność, jak w deklaracji zewnętrznej i odnosi się do tego samego obiektu lub funkcji. Jeśli jednak w zasięgu widoczności nie ma żadnej deklaracji zewnętrznej, to łączność tego identyfikatora jest zewnętrzna.
Preprocesor umożliwia makrogenerację, kompilację warunkową oraz włączanie do programów zawartości wskazanych plików. Wiersze programu rozpoczynające się znakiem # (ewentualnie poprzedzonym odstępami) służą do komunikacji z preprocesorem. Składnia tych wierszy jest niezależna od reszty języka; mogą one wystąpić gdziekolwiek w programie, a ich działanie kończy się (niezależnie od zasad dostępności) wraz z końcem jednostki tłumaczenia. Granice wierszy są istotne - każdy wiersz jest rozpatrywany indywidualnie (ale w p. A12.2 opisano, jak można taki wiersz przedłużyć). Leksemami dla preprocesora są wszystkie leksemy języka lub ciągi znaków tworzące nazwy plików, jak w wierszu #include (p. A12.4). Ponadto każdy znak, którego nie zdefiniowano inaczej, jest traktowany jako leksem, ale w wierszach preprocesora znaczenie białych znaków innych niż odstęp i tabulacja pozioma nie jest określone.
Przebieg preprocesora odbywa się w kilku logicznie po sobie następujących fazach, które w konkretnych implementacjach mogą być połączone:
1. Trzyznakowe sekwencje opisane w p. A12.1 są jako pierwsze zastępowane przez ich odpowiedniki. Jeśli środowisko systemu operacyjnego tego wymaga, to pomiędzy wiersze programu wstawia się znaki nowego wiersza.
2. Wszystkie wystąpienia kombinacji znaku \ i nowego wiersza są usuwane, co prowadzi do sklejenia wierszy (p. A 12.2).
3. Program jest przekształcany na ciąg leksemów rozdzielonych odstępami; komentarze zastępuje się pojedynczym odstępem. Następnie wykonuje się instrukcje preprocesora i dokonuje makrorozwinięć (p. A12.3-A12.10).
4. Sekwencje specjalne w stałych znakowych i napisach (p. A2.5.2, A2.6) zastępuje się ich odpowiednikami; następnie skleja się sąsiadujące ze sobą napisy.
5. Wynik jest tłumaczony, a następnie łączony z innymi programami i bibliotekami, by skompletować niezbędne podprogramy i dane oraz by odniesienia do zewnętrznych funkcji i obiektów powiązać z ich definicjami.
Zbiór znaków stosowanych w programach źródłowych w języku C zawiera się w 7-bi-towym zbiorze ASCII, ale jest nadzbiorem zbioru ISO 646-1983 Invariant Codę Set. Aby umożliwić napisanie programów w tym ograniczonym zbiorze znaków, wszystkie wystąpienia następujących trzyznakowych sekwencji zastępuje się odpowiednimi pojedynczymi znakami. Odbywa się to przed jakimkolwiek innym przetwarzaniem tekstu programu.
20 - Język ANSI C 305