C Academy · Lekcja

extern i konsolidacja

Udostępni Pan/Pani symbole między plikami.

Lekcja 3 z 413 kroki

extern i konsolidacja to bezpłatna lekcja C Academy na CoddyKit. To lekcja 3 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej C Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs C Academy zawiera 4 lekcji w sumie.

Czym jest konsolidacja?

Konsolidacja określa, czy dana nazwa może być współdzielona między różnymi plikami źródłowymi.

Nazwa o zewnętrznym powiązaniu odnosi się do tego samego elementu w całym programie. Nazwa o wewnętrznym powiązaniu jest prywatna dla własnego pliku. Zrozumienie powiązań ma kluczowe znaczenie w programach składających się z wielu plików.

Udostępnianie zmiennej

Załóżmy, że dwa pliki muszą mieć dostęp do jednego globalnego licznika. Nie można po prostu zdefiniować go w obu plikach — powstaną wtedy dwie osobne zmienne, a podczas konsolidowania wystąpi błąd zduplikowanego symbolu.

Zamiast tego należy zdefiniować go tylko raz, a we wszystkich pozostałych miejscach zadeklarować za pomocą extern.

/* config.c */
int g_count = 0;   /* the one definition */

Słowo kluczowe extern

extern informuje kompilator, że zmienna istnieje w innym miejscu programu, ale nie przydziela dla niej tutaj pamięci.

Jest to wyłącznie deklaracja. Konsolidator później powiąże ją z jedną definicją znajdującą się w innym pliku.

/* other.c */
extern int g_count;   /* declared, not defined */

void bump(void) {
    g_count++;
}

Deklaracja w pliku nagłówkowym

Przejrzysty schemat jest następujący: deklarację extern należy umieścić w pliku nagłówkowym, a odpowiadającą jej definicję dokładnie w jednym pliku źródłowym.

Każdy plik, który dołączy plik nagłówkowy, będzie mógł używać współdzielonej zmiennej.

/* config.h */
#ifndef CONFIG_H
#define CONFIG_H
extern int g_count;
#endif

Jedna definicja, wiele deklaracji

To reguła jednej definicji dotycząca zmiennych globalnych: zmienną można deklarować za pomocą extern w wielu plikach, ale definiować tylko w jednym.

Pojedyncza definicja (bez extern) przydziela pamięć. Wszystkie deklaracje extern jedynie wskazują tę definicję.

/* config.h */ extern int g_count;  /* declaration */
/* config.c */ int g_count = 0;     /* definition  */

Funkcje również mają wiązanie zewnętrzne

Domyślnie funkcje również mają wiązanie zewnętrzne, dlatego prototyp umieszczony w pliku nagłówkowym pozwala wywoływać je z innych plików.

Przed prototypem można zapisać extern, ale jest to zbędne — funkcje mają wiązanie zewnętrzne, chyba że zostanie określone inaczej.

/* both forms mean the same */
int add(int a, int b);
extern int add(int a, int b);

Wiązanie wewnętrzne za pomocą static

Słowo kluczowe static użyte w zakresie pliku nadaje nazwie wiązanie wewnętrzne: jest ona widoczna tylko we własnym pliku źródłowym.

Należy używać go w przypadku funkcji pomocniczych i zmiennych globalnych, które powinny pozostać prywatne dla modułu. Inne pliki nie mogą ich zobaczyć ani wejść z nimi w konflikt.

/* parser.c */
static int line_no = 0;   /* private to parser.c */

static void advance(void) {  /* private helper */
    line_no++;
}

extern a static

Te dwa słowa kluczowe znajdują się na przeciwległych końcach spektrum wiązania.

extern żąda wiązania zewnętrznego: udostępnia nazwę między plikami. static w zakresie pliku wymusza wiązanie wewnętrzne: zachowuje nazwę jako prywatną. Właściwy wybór określa, co moduł udostępnia na zewnątrz.

extern int shared_total;   /* visible everywhere */
static int local_cache;    /* only this file */

Częsty błąd

Początkujący czasami umieszczają w pliku nagłówkowym zwykłą definicję, taką jak int g_count;.

Ponieważ plik nagłówkowy jest dołączany w kilku plikach, każdy z nich otrzymuje własną definicję, a konsolidator zgłasza zduplikowany symbol. W pliku nagłówkowym należy zawsze używać deklaracji extern, a definicję umieścić raz w pliku .c.

/* WRONG in a header included twice */
int g_count;          /* multiple definition */
/* RIGHT */
extern int g_count;   /* declaration only */

Połączenie wszystkich elementów

Ten układ trzech plików to standardowy sposób współdzielenia stanu.

Plik nagłówkowy zawiera deklarację, jeden plik źródłowy definicję, a pozostałe pliki używają zmiennej po dołączeniu pliku nagłówkowego. Konsolidator łączy wszystkie odwołania z pojedynczą definicją.

/* config.h */ extern int g_count;
/* config.c */ #include "config.h"
               int g_count = 0;
/* main.c   */ #include "config.h"
               /* uses g_count */

Uwaga dotycząca inicjalizacji

Tylko właściwa definicja powinna nadawać wartość początkową: int g_count = 0;.

Deklaracja extern nie może inicjalizować zmiennej, ponieważ nie przydziela pamięci. Zapisanie extern int g_count = 0; zmienia ją w definicję i niweczy cel użycia extern.

extern int g_count;       /* ok: declaration */
extern int g_count = 0;   /* becomes a definition */

Szybki test

Sprawdź swoją wiedzę na temat extern i wiązania.

Podsumowanie

Dowiedzieli się Państwo, że wiązanie określa widoczność między plikami. extern deklaruje nazwę zdefiniowaną w innym miejscu, a static w zakresie pliku zachowuje nazwę jako prywatną.

Zmienne globalne należy współdzielić za pomocą jednej definicji i deklaracji extern. Następnie skompilujemy te pliki i połączymy je w program.

Bezpłatny start

Ucz się C dzięki korepetycjom AI — za darmo

Pisz i uruchamiaj kod w przeglądarce, otrzymuj natychmiastową pomoc od korepetytora AI dostępnego 24/7 i kontynuuj naukę w sieci lub w aplikacji.

Kursy
39
Lekcje
144

Często zadawane pytania

Czy lekcja „extern i konsolidacja” jest bezpłatna?

Tak — pełny tekst „extern i konsolidacja” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu C Academy, przejdź na CoddyKit PRO. Kurs C Academy zawiera 4 lekcji w sumie.

Co nauczysz się w „extern i konsolidacja”?

Udostępni Pan/Pani symbole między plikami. Ćwiczysz C Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć C Academy?

Nie wymagamy żadnego doświadczenia. C Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 3 z 4.

Ile czasu zajmuje lekcja „extern i konsolidacja”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji C Academy?

Tak. Każda lekcja C Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Pliki nagłówkowe i źródłowe
  2. Strażniki dołączania
  3. extern i konsolidacja
  4. Kompilowanie wielu plików
← Powrót do C Academy