Zakres i widoczność
"Widoczność" identyfikatora określa części programu, do których można się odwoływać — jego "zakres". Identyfikator jest widoczny (tj. może być używany) tylko w częściach programu objętego jego "zakresem", który może być ograniczony (w celu zwiększenia restrykcyjności) do pliku, funkcji, bloku lub prototypu funkcji, w którym się pojawia. Zakres identyfikatora jest częścią programu, w której może być używana nazwa. Jest to czasami nazywane "zakresem leksykalnym". Istnieją cztery rodzaje zakresu: funkcja, plik, blok i prototyp funkcji.
Wszystkie identyfikatory z wyjątkiem etykiet mają zakres uzależniony od poziomu, na którym występuje deklaracja. Dla każdego rodzaju zakresu, widocznością identyfikatorów w programie rządzą następujące zasady:
Zakres pliku
Specyfikator lub specyfikator typu dla identyfikatora z zakresem pliku pojawia się poza dowolnym blokiem lub listą parametrów i jest dostępny z dowolnego miejsca w jednostce tłumaczenia po jego deklaracji. Nazwy identyfikatorów z zakresem plików są często nazywane "globalnymi" lub "zewnętrznymi". Zakres identyfikatora globalnego rozpoczyna się od momentu jego definicji lub deklaracji i kończy się na końcu jednostki tłumaczenia.
Zakres funkcji
Etykieta jest jedynym rodzajem identyfikatora, który ma zakres funkcji. Etykieta jest niejawnie zadeklarowana przez jej użycie w instrukcji. Nazwy etykiet muszą być unikatowe w obrębie danej funkcji. (Aby uzyskać więcej informacji na temat etykiet i nazw etykiet, zobacz Instrukcje goto i Oznaczone).
Zakres bloku
Specyfikator lub specyfikator typu dla identyfikatora z zakresem bloku pojawia się wewnątrz bloku lub na liście formalnych deklaracji parametrów w definicji funkcji. Jest widoczny tylko od punktu jego deklaracji lub definicji do końca bloku, zawierającego jego deklarację lub definicję. Jej zakres jest ograniczony do tego bloku i wszelkich bloków zagnieżdżonych w tym bloku i kończy się nawiasem klamrowym, który zamyka skojarzony blok. Takie identyfikatory są czasami nazywane „zmiennymi lokalnymi”.
Zakres prototypu funkcji
Specyfikator lub specyfikator typu dla identyfikatora z zakresem prototypu funkcji pojawia się na liście deklaracji parametrów w prototypie funkcji (a nie części deklaracji funkcji). Jej zakres kończy się z końcem deklaratora funkcji.
Odpowiednie deklaracje do tworzenia zmiennych widocznych w innych plikach źródłowych są opisane w klasach magazynu. Jednak zmienne i funkcje zadeklarowane na poziomie zewnętrznym ze specyfikatorem static
klasy magazynu są widoczne tylko w pliku źródłowym, w którym są zdefiniowane. Wszystkie pozostałe funkcje są widoczne globalnie.