C Academy · leksjon

Prosjekter med flere filer

Headere og oversettelsesenheter

Leksjon 2 av 413 trinn

Prosjekter med flere filer er en gratis leksjon i C Academy på CoddyKit. Dette er leksjon 2 av 4. Du kan lese hele leksjonen gratis nedenfor – og deretter øve praktisk i nettleseren med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i C Academy, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i C Academy inneholder totalt 4 leksjoner.

Hvorfor dele opp filer

Virkelige programmer ligger ikke i én .c-fil. Når koden deles opp i flere filer:

  • grupperes relaterte funksjoner sammen
  • kan kompilatoren bygge på nytt bare det som er endret
  • blir koden gjenbrukbar på tvers av prosjekter
  • kan et team arbeide uten stadige konflikter

Det er viktig å forstå hvordan delene lenkes sammen.

Oversettelsesenheter

Hver .c-fil blir, etter at preprosessoren har utvidet #include-direktivene, til en translation unit.

Kompilatoren gjør hver oversettelsesenhet uavhengig om til en objektfil (.o). På dette stadiet kjenner den ikke til de andre filene.

Deklarasjon kontra definisjon

En deklarasjon forteller kompilatoren at en funksjon finnes, og angir signaturen. En definisjon inneholder selve funksjonskroppen.

Andre filer trenger bare deklarasjonen for å kunne kalle funksjonen. Definisjonen finnes nøyaktig ett sted.

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

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

Header-filen

Deklarasjoner plasseres i en header (.h). Alle filer som vil bruke funksjonen, inkluderer headeren.

Headeren er det offentlige grensesnittet, mens den tilhørende .c-filen er den private implementasjonen.

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

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

#endif

Implementasjonsfilen

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

Når De inkluderer Deres egen header, kan kompilatoren kontrollere at definisjonene samsvarer med deklarasjonene.

/* 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; }

Bruke modulen

En annen fil inkluderer headeren og kaller funksjonene. Den trenger aldri å se funksjonskroppene.

Kompilatoren stoler på deklarasjonene, mens lenkeren senere kobler kallene til de faktiske definisjonene.

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

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

Kompilere og lenke

Det skjer i to faser. Først kompilerer De hver fil til en objektfil med -c. Deretter lenker De objektfilene til én kjørbar fil.

Lenkeren løser hvert kall til add ved å finne definisjonen 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

Inkluderingssyntaksen styrer søkestien:

  • #include "math_utils.h" søker først i prosjektmappen
  • #include <stdio.h> søker bare i systemets include-stier

Bruk anførselstegn for egne headere og vinkelparenteser for standardbiblioteket.

Nøkkelordet extern

For å dele en global variabel mellom filer definerer De den én gang i en .c-fil og deklarerer den med extern i headeren.

extern sier at «denne variabelen finnes et annet sted», slik at doble definisjoner unngås.

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

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

Nøkkelordet static

På filnivå gjør static en funksjon eller variabel privat for sin oversettelsesenhet.

En statisk hjelpefunksjon kan ikke lenkes fra andre filer. Det hindrer navnekollisjoner og skjuler implementasjonsdetaljer. Dette er C-måten å markere noe som internt på.

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

Regelen om én definisjon

En ikke-statisk funksjon eller global variabel kan defineres nøyaktig én gang i hele programmet. Deklarer den i mange filer, men definer den i én.

To definisjoner av add gir en linkerfeil som multiple definition of 'add'. Derfor skal funksjonskropper ikke ligge i headerfiler.

Kort kontroll

Vurder hva som hører hjemme i en headerfil.

Oppsummering

De kan nå strukturere et prosjekt med flere filer:

  • Hver .c-fil er en oversettelsesenhet som kompileres uavhengig til en .o-fil
  • Headerfiler inneholder deklarasjoner; én .c-fil inneholder hver definisjon
  • Linkeren løser kall på tvers av objektfiler
  • extern deler globale variabler; static holder fil-lokale symboler private

Deretter: automatisering av byggingen med Makefiles.

Gratis å komme i gang

Lær deg C med en AI-veileder – gratis

Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.

Kurs
39
Leksjoner
144

Ofte stilte spørsmål

Er leksjonen «Prosjekter med flere filer» gratis?

Ja – hele teksten i «Prosjekter med flere filer» er gratis å lese her på nettet. For å øve interaktivt med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt, og for å låse opp resten av C Academy-kurset, kan du oppgradere til CoddyKit PRO. Kurset i C Academy inneholder totalt 4 leksjoner.

Hva lærer jeg i «Prosjekter med flere filer»?

Headere og oversettelsesenheter Du øver på C Academy med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.

Trenger jeg erfaring for å begynne med C Academy?

Ingen tidligere erfaring er nødvendig. C Academy på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 2 av 4.

Hvor lang tid tar leksjonen «Prosjekter med flere filer»?

De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.

Kan jeg skrive og kjøre kode i denne C Academy-leksjonen?

Ja. Alle C Academy-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.

Alle leksjonene i dette kurset

  1. Betinget kompilering
  2. Prosjekter med flere filer
  3. Makefiler
  4. Statiske og delte biblioteker
← Tilbake til C Academy