C Academy · Lektion

Projekter med flere filer

Headers og translation units

Lektion 2 af 413 trin

Projekter med flere filer er en gratis C Academy-lektion på CoddyKit. Dette er lektion 2 af 4. Du kan læse hele lektionen gratis nedenfor — og derefter øve dig praktisk i browseren med en indbygget kodeeditor og en AI-vejleder, der er tilgængelig døgnet rundt. Den er en del af læringsforløbet i C Academy, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. C Academy-kurset indeholder 4 lektioner i alt.

Hvorfor opdele filer

Rigtige programmer ligger ikke i én .c-fil. Når du opdeler koden i flere filer:

  • samler du relaterede funktioner
  • kan compileren kun genbygge det, der er ændret
  • bliver koden genanvendelig på tværs af projekter
  • kan et team arbejde uden konstante konflikter

Det er vigtigt at forstå, hvordan delene linkes.

Oversættelsesenheder

Hver .c-fil bliver, efter at præprocessoren har udvidet dens #includes, til en oversættelsesenhed.

Compileren omdanner hver oversættelsesenhed til en objektfil (.o) uafhængigt af de andre. På dette trin kender den ikke de øvrige filer.

Deklaration kontra definition

En deklaration fortæller compileren, at en funktion findes, og angiver dens signatur. En definition indeholder den faktiske funktionskrop.

Andre filer behøver kun deklarationen for at kalde en funktion. Definitionen findes præcis ét sted.

int add(int a, int b);          /* declaration: a promise */

int add(int a, int b) {         /* definition: the body */
    return a + b;
}

Headerfilen

Deklarationer placeres i en header (.h). Enhver fil, der vil bruge funktionen, inkluderer headeren.

Headeren er den offentlige grænseflade; den tilsvarende .c-fil er den private implementering.

/* math_utils.h */
#ifndef MATH_UTILS_H
#define MATH_UTILS_H

int add(int a, int b);
int mul(int a, int b);

#endif

Implementeringsfilen

.c-filen inkluderer sin egen header og definerer funktionerne.

Når du inkluderer din egen header, kan compileren kontrollere, at definitionerne stemmer overens med deklarationerne.

/* math_utils.c */
#include "math_utils.h"

int add(int a, int b) { return a + b; }
int mul(int a, int b) { return a * b; }

Brug af modulet

En anden fil inkluderer headeren og kalder funktionerne. Den behøver aldrig at se funktionskroppene.

Compileren stoler på deklarationerne; linkeren forbinder senere kallene med de rigtige definitioner.

/* main.c */
#include <stdio.h>
#include "math_utils.h"

int main(void) {
    printf("%d\n", add(2, 3));
    return 0;
}

Kompilering og linking

To faser. Først skal du kompilere hver fil til en objektfil med -c. Derefter skal du linke objekterne til én eksekverbar fil.

Linkeren løser hvert kald til add ved at finde definitionen i math_utils.o.

gcc -c main.c          # -> main.o
gcc -c math_utils.c    # -> math_utils.o
gcc main.o math_utils.o -o app

Anførselstegn kontra vinkelparenteser

Include-syntaksen styrer søgestien:

  • #include "math_utils.h" søger først i projektmappen
  • #include <stdio.h> søger kun i systemets include-stier

Brug anførselstegn til dine egne headere og vinkelparenteser til standardbiblioteket.

Nøgleordet extern

Hvis du vil dele en global variabel på tværs af filer, skal du definere den én gang i en .c-fil og deklarere den med extern i headeren.

extern betyder, at 'denne variabel findes et andet sted', så du undgår duplikerede definitioner.

/* in config.h */
extern int g_verbose;   /* declaration */

/* in config.c */
int g_verbose = 0;      /* the single definition */

Nøgleordet static

På filniveau gør static en funktion eller variabel privat for sin oversættelsesenhed.

En statisk hjælpefunktion kan ikke linkes fra andre filer, hvilket forhindrer navnekonflikter og skjuler implementeringsdetaljer. Det er C's måde at markere noget internt på.

/* visible only inside this .c file */
static int helper(int x) {
    return x * 2;
}

Reglen om én definition

En ikke-statisk funktion eller global variabel må defineres præcis én gang i hele programmet. Erklær den i mange filer, men definér den i én.

To definitioner af add giver en linkerfejl som multiple definition of 'add'. Derfor skal funktionslegemer ikke placeres i headerfiler.

Hurtigt tjek

Overvej, hvad der hører hjemme i en headerfil.

Opsummering

Du kan nu strukturere et projekt med flere filer:

  • Hver .c-fil er en oversættelsesenhed, der kompileres til en .o-fil uafhængigt
  • Headerfiler indeholder deklarationer; én .c-fil indeholder hver definition
  • Linkeren løser kald på tværs af objektfiler
  • extern deler globale variable; static holder fil-lokale symboler private

Næste trin: automatisering af buildet med Makefiles.

Gratis at komme i gang

Lær C med en AI-underviser — gratis

Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.

Kurser
39
Lektioner
144

Ofte stillede spørgsmål

Er lektionen “Projekter med flere filer” gratis?

Ja — hele teksten til “Projekter med flere filer” kan læses gratis her på nettet. Hvis du vil øve dig interaktivt med en indbygget kodeeditor og en AI-vejleder døgnet rundt og få adgang til resten af C Academy-kurset, skal du opgradere til CoddyKit PRO. C Academy-kurset indeholder 4 lektioner i alt.

Hvad lærer jeg i “Projekter med flere filer”?

Headers og translation units Du øver dig i C Academy med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.

Skal jeg have erfaring for at begynde på C Academy?

Der kræves ingen tidligere erfaring. C Academy på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 2 af 4.

Hvor lang tid tager lektionen “Projekter med flere filer”?

De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.

Kan jeg skrive og køre kode i denne C Academy-lektion?

Ja. Alle C Academy-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.

Alle lektioner i dette kursus

  1. Betinget kompilering
  2. Projekter med flere filer
  3. Makefiles
  4. Statiske og shared libraries
← Tilbage til C Academy