C Academy · Oppitunti

Monitiedostoprojektit

Otsakkeet ja käännösyksiköt.

Oppitunti 2/413 vaihetta

Monitiedostoprojektit on ilmainen C Academy-oppitunti CoddyKitissä. Tämä on oppitunti 2/4. Voit lukea koko oppitunnin alta ilmaiseksi ja harjoitella sen jälkeen käytännössä selaimessa sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla. Oppitunti kuuluu C Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. C Academy-kurssilla on yhteensä 4 oppituntia.

Miksi tiedostot jaetaan

Oikeat ohjelmat eivät sijaitse yhdessä .c-tiedostossa. Koodin jakaminen useisiin tiedostoihin:

  • Ryhmittelee toisiinsa liittyvät funktiot
  • Antaa kääntäjän kääntää uudelleen vain muuttuneet osat
  • Tekee koodista uudelleenkäytettävää eri projekteissa
  • Antaa tiimin työskennellä ilman jatkuvia ristiriitoja

On tärkeää ymmärtää, miten osat yhdistetään.

Käännösyksiköt

Jokaisesta .c-tiedostosta tulee #include-sisällytysten laajentamisen jälkeen käännösyksikkö.

Kääntäjä muuntaa jokaisen käännösyksikön itsenäisesti objektitiedostoksi (.o). Tässä vaiheessa se ei tiedä muista tiedostoista.

Esittely ja määrittely

Esittely kertoo kääntäjälle, että funktio on olemassa, sekä ilmoittaa sen allekirjoituksen. Määrittely sisältää varsinaisen rungon.

Muut tiedostot tarvitsevat funktiota kutsuessaan vain esittelyn. Määrittely sijaitsee täsmälleen yhdessä paikassa.

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

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

Otsikkotiedosto

Esittelyt sijoitetaan header-tiedostoon (.h). Jokainen funktiota käyttävä tiedosto sisällyttää tämän otsikkotiedoston.

Otsikkotiedosto on julkinen rajapinta; vastaava .c-tiedosto on yksityinen toteutus.

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

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

#endif

Toteutustiedosto

.c-tiedosto sisällyttää oman otsikkotiedostonsa ja määrittelee funktiot.

Oman otsikkotiedoston sisällyttäminen antaa kääntäjän tarkistaa, että määrittelyt vastaavat esittelyjä.

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

Moduulin käyttäminen

Toinen tiedosto sisällyttää otsikkotiedoston ja kutsuu funktioita. Sen ei tarvitse koskaan nähdä funktioiden runkoja.

Kääntäjä luottaa esittelyihin; linkkeri yhdistää kutsut myöhemmin oikeisiin määrittelyihin.

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

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

Kääntäminen ja linkitys

Kaksi vaihetta. Käännä ensin jokainen tiedosto objektitiedostoksi valitsimella -c. Linkitä sitten objektit yhdeksi suoritettavaksi tiedostoksi.

Linkkeri ratkaisee jokaisen add-kutsun etsimällä sen määrittelyn tiedostosta 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

Lainausmerkit ja kulmasulkeet

Sisällytyksen syntaksi määrittää hakupolun:

  • #include "math_utils.h" etsii ensin projektihakemistosta
  • #include <stdio.h> etsii vain järjestelmän include-polkuista

Käyttäkää lainausmerkkejä omille otsikkotiedostoille ja kulmasulkeita standardikirjastolle.

extern-avainsana

Jakaaksesi globaalin muuttujan tiedostojen kesken määrittele se kerran .c-tiedostossa ja esittele se extern-määritteellä otsikkotiedostossa.

extern kertoo, että ”tämä muuttuja on olemassa jossakin muualla”, ja estää kaksoismäärittelyt.

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

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

static-avainsana

Tiedoston laajuudessa static tekee funktiosta tai muuttujasta yksityisen käännösyksikölleen.

Staattista apufunktiota ei voi linkittää muista tiedostoista, mikä estää nimien törmäykset ja piilottaa toteutuksen yksityiskohdat. C-kielessä sillä merkitään sisäiseen käyttöön tarkoitettuja asioita.

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

One Definition Rule -sääntö

Staattiton funktio tai globaali muuttuja voidaan määritellä täsmälleen kerran koko ohjelmassa. Sen voi ilmoittaa monessa tiedostossa, mutta määritelmän tulee olla yhdessä tiedostossa.

add-funktion kaksi määritelmää aiheuttavat linkittäjän virheen, kuten multiple definition of 'add'. Siksi funktioiden runkoja ei sijoiteta otsikkotiedostoihin.

Pikatarkistus

Päätelkää, mikä kuuluu otsikkotiedostoon.

Kertaus

Osaatte nyt jäsentää usean tiedoston projektin:

  • Jokainen .c-tiedosto on käännösyksikkö, joka käännetään itsenäisesti .o-tiedostoksi
  • Otsikkotiedostot sisältävät esittelyt; kunkin määritelmän sisältää yksi .c-tiedosto
  • Linkittäjä ratkaisee objektitiedostojen väliset kutsut
  • extern jakaa globaalit muuttujat; static pitää tiedostokohtaiset symbolit yksityisinä

Seuraavaksi automatisoidaan koonti Makefile-tiedostoilla.

Aloita maksutta

Opi C tekoälytuutorin avulla — ilmaiseksi

Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.

Kurssit
39
Oppitunnit
144

Usein kysytyt kysymykset

Onko oppitunti ”Monitiedostoprojektit” ilmainen?

Kyllä – oppitunnin ”Monitiedostoprojektit” koko tekstin voi lukea täällä verkossa ilmaiseksi. Jos haluat harjoitella interaktiivisesti sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla sekä avata koko C Academy-kurssin, päivitä CoddyKit PROhon. C Academy-kurssilla on yhteensä 4 oppituntia.

Mitä opin oppitunnilla ”Monitiedostoprojektit”?

Otsakkeet ja käännösyksiköt. Harjoittelet C Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.

Tarvitsenko kokemusta aloittaakseni C Academy-opiskelun?

Aiempi kokemus ei ole tarpeen. CoddyKitin C Academy-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 2/4.

Kuinka kauan ”Monitiedostoprojektit”-oppitunnin suorittaminen kestää?

Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.

Voinko kirjoittaa ja suorittaa koodia tällä C Academy-oppitunnilla?

Kyllä. Jokainen C Academy-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.

Kaikki tämän kurssin oppitunnit

  1. Ehdollinen käännös
  2. Monitiedostoprojektit
  3. Makefile-tiedostot
  4. Staattiset ja jaetut kirjastot
← Takaisin: C Academy