C Academy · Lektion

Header- og source-filer

Adskil deklarationer og kode.

Lektion 1 af 413 trin

Header- og source-filer er en gratis C Academy-lektion på CoddyKit. Dette er lektion 1 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 kode i filer?

Efterhånden som C-programmer vokser, bliver det svært at læse og langsomt at kompilere, hvis alt ligger i én .c-fil.

C lader dig opdele et projekt i flere filer, hvor hver fil håndterer ét område. Det forbedrer organiseringen, gør det muligt at genbruge kode og betyder, at en ændring i én del ikke tvinger dig til at kompilere alt igen.

To slags filer

Et modulopbygget C-projekt bruger to filtyper.

Kildefiler (.c) indeholder den faktiske implementation: funktionskroppe og definitioner.

Headerfiler (.h) indeholder deklarationer: funktionsprototyper, typedefinitioner og makroer, som andre filer skal kende.

En headerfil

En header deklarerer hvad der findes, uden at fortælle hvordan det fungerer.

Her deklarerer math_utils.h funktionen add. Alle filer, der inkluderer denne header, kender funktionens signatur og kan kalde den.

/* math_utils.h */
int add(int a, int b);

Den tilsvarende kildefil

Kildefilen leverer implementationen. Den inkluderer sin egen header, så compileren kan kontrollere, at definitionen stemmer overens med deklarationen.

Bemærk, at headeren inkluderes med anførselstegn, hvilket bruges til projektets egne filer.

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

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

Brug af modulet

Nu inkluderer main.c headeren og kalder add. Den ser aldrig funktionskroppen, men kun prototypen.

Compileren stoler på deklarationen; senere forbinder linkeren kaldet med den rigtige implementation i math_utils.c.

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

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

Anførselstegn kontra vinkelparenteser

Direktivet #include har to former.

#include <stdio.h> bruger vinkelparenteser til system- og standardbibliotekets headere. Compileren søger i sine standardstier til inkluderede filer.

#include "math_utils.h" bruger anførselstegn til dine egne headere, som først søges i den aktuelle mappe.

#include <stdio.h>      /* standard library */
#include "math_utils.h" /* your project */

Hvad hører hjemme i en header

Anbring deklarationer i headere, ikke definitioner.

Godt indhold i en header er funktionsprototyper, struct- og typedef-deklarationer, #define-makroer og extern-deklarationer af variabler.

Undgå funktionskroppe eller variabeldefinitioner her, da det kan forårsage fejl med duplikerede symboler.

/* shapes.h */
typedef struct {
    double width;
    double height;
} Rect;

double rect_area(Rect r);

Hvad hører hjemme i en kildefil

Kildefilen indeholder det egentlige arbejde: funktionsdefinitioner og filens private hjælpefunktioner.

Den inkluderer den tilsvarende header, så compileren kan kontrollere, at signaturerne stemmer overens. Det fanger uoverensstemmelser tidligt i stedet for ved linkning.

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

double rect_area(Rect r) {
    return r.width * r.height;
}

Deklaration kontra definition

Denne forskel er central i modulopbygget C.

En deklaration fortæller compileren et navns type og signatur, så navnet kan bruges: int add(int, int);

En definition opretter den faktiske enhed, allokerer lagerplads eller leverer funktionskroppen. Headere deklarerer; kildefiler definerer.

int add(int a, int b);          /* declaration */
int add(int a, int b) {         /* definition */
    return a + b;
}

Navngivningskonventioner

Et almindeligt mønster parrer hvert modul efter navn: logger.h med logger.c og parser.h med parser.c.

Det gør det tydeligt, hvor en implementation findes. Gruppér relaterede funktioner i ét modul, så hver fil har ét klart ansvar.

/* logger.h */
void log_info(const char *msg);
void log_error(const char *msg);

Overblik over bygningen

Hver .c-fil kompileres uafhængigt til en objektfil, hvorefter alle objekter linkes til ét program.

Headere kompileres ikke alene; de indsættes som tekst i de kildefiler, der inkluderer dem. Vi gennemgår hele byggeforløbet i en senere lektion.

gcc -c main.c        /* -> main.o */
gcc -c math_utils.c  /* -> math_utils.o */
gcc main.o math_utils.o -o app

Hurtig kontrol

Test din forståelse af headeres og kildefilers roller.

Opsummering

Du har lært at opdele et C-projekt i .h-headere og .c-kildefiler.

Headere deklarerer, hvad der findes; kildefiler definerer, hvordan det fungerer. Brug anførselstegn til dine egne headere og vinkelparenteser til standardheadere.

Derefter forhindrer vi problemer, der skyldes, at en header inkluderes mere end én gang.

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 “Header- og source-filer” gratis?

Ja — hele teksten til “Header- og source-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 “Header- og source-filer”?

Adskil deklarationer og kode. 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 1 af 4.

Hvor lang tid tager lektionen “Header- og source-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. Header- og source-filer
  2. Include guards
  3. extern og linkage
  4. Kompilér flere filer
← Tilbage til C Academy