C keele include-lausungi täielik juhend: standardteegid, kasutaja päisefailid ja parimad praktikad

1. Mis on include-lausung?

Include-lausungi põhimõiste

include-lausung on C-keeles preprotsessoridirektiiv, mis võimaldab teistest failidest koodi programmi lisada. Selle direktiivi abil saab lisada väliseid teeke ja kasutaja enda loodud päisefaile. Tegelikult kopeeritakse määratud faili sisu kompileerimise ajal vastavale kohale. Nii saab hõlpsasti kasutada vajalikke funktsioonide või makrode definitsioone ning parandada koodi taaskasutatavust ja hooldatavust.

Kopeeri ja kleebi mehhanism

include-lausungi mehhanism on väga lihtne. Kui kirjutad programmi algusesse näiteks #include <failinimi>, lisatakse kompileerimisel selle faili sisu otse programmi. Näiteks, kui kasutad #include <stdio.h>, lisatakse kõik stdio.h-failis määratud funktsioonide prototüübid ja makrod, misjärel saad neid programmis kasutada. Tänu sellele pole vaja kõiki määratlusi ise kirjutada ja arendamine muutub efektiivsemaks.

2. Standardteekide include

Standardsete päisefailide kasutamine

C-keele standardteek pakub sageli kasutatavaid funktsioone päisefailide kujul. Näiteks stdio.h sisaldab sisend-väljund funktsioone ning math.h matemaatilisi funktsioone. Nende päisefailide lisamisel #include-lausungiga saab neid funktsioone programmis kasutada.

#include <stdio.h>
#include <math.h>

int main() {
    printf("Hello, world!n");
    printf("Square root of 16 is: %f", sqrt(16));
    return 0;
}

Selles näites saab stdio.h kaudu kasutada printf-funktsiooni ning math.h kaudu sqrt-funktsiooni. Nii on lihtne kasutada standardteekide võimsaid võimalusi.

侍エンジニア塾

3. Kasutaja loodud päisefailide include

Päisefailide loomine

Lisaks standardteekidele saab kaasata ka enda loodud päisefaile. Omatehtud päisefaili saab defineerida funktsioonide prototüüpidega, makrodega või struktuuridega. Näiteks, kui lood päisefaili nimega my_header.h ja defineerid selles funktsiooni say_hello(), näeb see välja järgmine:

// my_header.h
void say_hello();

Kui soovid seda kasutada, lisa päisefail include-lausungiga järgnevalt:

#include <stdio.h>
#include "my_header.h"

int main() {
    say_hello();
    return 0;
}

Näidiskood

Selles näites võimaldab omatehtud päisefaili my_header.h kaasamine kasutada funktsiooni say_hello. Kasutaja loodud päisefaile tuleb #include-lausungis kirjutada jutumärkidesse. Selline lähenemine muudab koodi modulaarseks ja taaskasutatavaks.

4. Include-lausungi rakendused

Mitme faili include

Suuremate programmide puhul võib vaja minna mitmete päisefailide kaasamist. Näiteks saab lisada nii stdio.h kui ka kasutaja loodud userdefined.h ja kasutada nende võimalusi.

#include <stdio.h>
#include "userdefined.h"

int main() {
    printf("This is a sample code.n");
    userDefinedFunction();
    return 0;
}

Mitme päisefaili kaasamisel saab programmi funktsionaalsust laiendada ning luua keerukamaid rakendusi.

Tingimuslik include

Preprotsessoridirektiive kasutades saab päisefaile lisada ainult kindlatel tingimustel. Näiteks saab teatud päisefaili lisada ainult silumisrežiimis:

#ifdef DEBUG
#include "debug.h"
#endif

See kood kaasab debug.h ainult juhul, kui DEBUG on defineeritud. Nii saab hallata erinevaid ehituskeskkondi ja -tingimusi.

5. Include-lausungi tähelepanekud ja lahendused

Topelt include probleem

Sama päisefaili mitmekordsel kaasamisel võib tekkida topeltdefineerimise viga. Selle vältimiseks kasutatakse include-kaitseid. Need on preprotsessoridirektiivid, mis tagavad, et päisefail kaasatakse vaid korra.

#ifndef HEADER_H
#define HEADER_H

// Päisefaili sisu

#endif

Samuti võib kasutada #pragma once, kuid see pole kõikides kompilaatorites standardne.

Include-tee seadistamine

Kui päisefaili ei leita, tuleb include-tee õigesti määrata. Kasutades GCC-d, saab tee määrata -I valikuga:

gcc -I/path/to/include -o myprogram myprogram.c

Nii leiab kompilaator vajalikud päisefailid õigesti üles.

6. Päisefaili struktuur ja projekti modulaarsus

Päisefailide ja lähtefailide seos

Päisefailides määratakse funktsioonide prototüübid, makrod ja struktuurid. Näiteks sisaldab stdio.h printf-funktsiooni prototüüpi. Seda päisefaili kaasates saad printf-i programmis kasutada.

Projekti struktuuri loomine

Suurtes projektides on koodi paremaks haldamiseks oluline kasutada kaustastruktuuri. Tavaliselt pannakse lähtefailid kausta src ja päisefailid kausta include.

project/
├── src/
│   ├── main.c
│   └── math_utils.c
├── include/
│   └── math_utils.h
└── build/

include-lausungit kasutades saab src kaustas olevad failid viidata include kaustas olevatele päisefailidele. Selline struktuur parandab koodi loetavust ja hooldatavust.

7. Include-lausungi parimad tavad

Päisefailide optimaalne kasutamine

Päisefaili luues tuleks korrektselt määrata funktsioonide prototüübid, makrod ja struktuurid. Samuti tuleb alati lisada include-kaitse, et vältida topelt include’i.

Efektiivne include kasutamine

Liigsete päisefailide kaasamine suurendab kompileerimisaega ja võib vähendada programmi jõudlust. On oluline kaasata ainult vajalikud päisefailid. Päisefailid, mis pole funktsionaalsuse jaoks vajalikud, pikendavad ainult kompileerimisaega ja võivad vähendada jõudlust. Tõhusa include kasutamiseks pea silmas järgmisi punkte:

  • Minimaalne include: Kaasa ainult vajalikke päisefaile.
  • Edasijõudnud deklaratsioonide kasutamine: Selle asemel, et kaasata kogu päisefail, kasuta vajadusel ainult funktsioonide või struktuuride deklaratsioone, et sõltuvusi vähendada.
  • Include’i järjekord: Kaasa esmalt standardsed päisefailid, seejärel kasutaja omad. Nii saab sõltuvusi paremini hallata ja kompileerimisvigu vältida.

8. Include-lausungiga projekti modulaarsus

Modulaarsuse tähtsus

Suurte C-keele programmide loomisel on modulaarsus oluline koodi korrastamiseks ja taaskasutatavuse parandamiseks. Modulaarsus tähendab, et programm jagatakse funktsionaalseteks osadeks ja iga osa hallatakse eraldi komponendina. Nii paraneb koodi loetavus ning hooldus ja silumine muutuvad lihtsamaks.

Modulaarsuse praktiline rakendamine

Modulaarsuse saavutamiseks luuakse iga funktsiooni kohta päisefail ja lähtefail. Päisefailis deklareeritakse funktsioonid ja andmetüübid, lähtefailis aga nende implementatsioon. Nii saab teised moodulid neid funktsioone kasutada lihtsalt päisefaili lisades.

// math_utils.h
#ifndef MATH_UTILS_H
#define MATH_UTILS_H

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

#endif // MATH_UTILS_H
// math_utils.c
#include "math_utils.h"

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

int subtract(int a, int b) {
    return a - b;
}

Selles näites deklareerib math_utils.h funktsioonid add ja subtract, mille implementatsioon asub failis math_utils.c. Modulaarsus muudab programmi struktuuri selgemaks ja parandab taaskasutatavust.