Projekter med flere filer
Headers og translation units
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);
#endifImplementeringsfilen
.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 appAnfø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
externdeler globale variable;staticholder fil-lokale symboler private
Næste trin: automatisering af buildet med Makefiles.
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
- Betinget kompilering
- Projekter med flere filer
- Makefiles
- Statiske og shared libraries