Kako podesiti pametne telefone i računare. Informativni portal
  • Dom
  • Programi
  • Svrha direktive uključivanja predprocesora. Preprocesorske direktive u C

Svrha direktive uključivanja predprocesora. Preprocesorske direktive u C

Gotovo svi C++ programi koriste specijalni timovi za kompajler, koje se nazivaju direktivama. IN opšti slučaj Direktiva je instrukcija prevodiocu jezika C++ da izvrši jednu ili drugu akciju u vreme kompilacije programa. Postoji striktno definiran skup mogućih direktiva, koji uključuje sljedeće definicije:

#define, #elif, #else, #endif, #if, #ifdef, #ifndef, #include, #undef.

Direktiva #define se koristi za specificiranje konstanti, ključne riječi, operatori i izrazi koji se koriste u programu. Opća sintaksa ove direktive je sljedeća:

Treba napomenuti da se simbol ';' ne stavlja iza direktiva. Evo primjera opcija za korištenje direktive #define.

Listing 1.2. Primjeri korištenja direktive #define.

#include
#definiraj DVA 2
#defini ČETIRI DVA*DVA
#define PX printf(“X jednako %d.\n”, x)
#define FMT "X jednako %d.\n"
#defini KVADRAT(X) X*X
int main()
{
int x = DVA;
PX;
x = ČETIRI;
printf(FMT, x);
x = KVADRAT(3);
PX;

Povratak 0;
}

Nakon izvršavanja ovog programa, na ekranu monitora će se pojaviti tri linije:

X je jednako 2.
X je jednako 4.
X je jednako 9.

Direktiva #undef poništava definiciju koju je prethodno uvela #define direktiva. Pretpostavimo da u nekom trenutku programa trebate dedefinirati konstantu FOUR. To se postiže sljedećom naredbom:

Zanimljiva karakteristika ove direktive je mogućnost redefiniranja vrijednosti prethodno unesene konstante. Zaista, ponovna upotreba #define direktive za prethodno uvedenu konstantu FOUR je nemoguća, jer ovo će rezultirati porukom o grešci kada se program prevede. Ali ako dedefinirate konstantu FOUR koristeći #undef direktivu, možete ponovo koristiti#define direktive za konstantu FOUR.

Da bi se mogla izvršiti uvjetna kompilacija, koristi se grupa direktiva #if, #ifdef, #ifndef, #elif, #else i #endif. Program u nastavku povezuje biblioteke ovisno o postavljenim konstantama.

#ako je definirano (GRAF)
#elif definiran(TEXT)
#else
#endif

Ovaj program radi na sljedeći način. Ako je konstanta pod nazivom GRAPH prethodno specificirana pomoću direktive #define, tada će grafička biblioteka biti uključena korištenjem direktive #include. Ako identifikator GRAPH nije definiran, ali je TEXT definicija prisutna, tada će se koristiti tekstualna I/O biblioteka. Inače, ako nema definicija, uključena je I/O biblioteka. Umjesto fraze #if definisano, često se koriste skraćenice #ifdef i #ifndef, a gornji program se može prepisati kao:

#ifdef GRAF
#include //veza grafička biblioteka
#ifdef TEKST
#include //povezivanje biblioteke teksta
#else
#include //uključuje I/O biblioteku
#endif

Razlika između #if direktive i #ifdef i #ifndef direktiva je u tome što vam omogućava da provjerite više različitih uvjeta, a ne samo postojanje ili nepostojanje bilo koje konstante. Na primjer, koristeći #if direktivu možete izvršiti sljedeću provjeru:

#ako VELIČINA == 1
#include // povezivanje matematičke biblioteke
#elif VELIČINA > 1
#include // povezivanje biblioteke za obradu niza
#endif

U gornjem primjeru, povežite bilo koji matematička biblioteka, ili biblioteka za obradu niza, ovisno o vrijednosti konstante SIZE.

Ove direktive se ponekad koriste za isticanje potrebnih programskih blokova koji se moraju koristiti u određenom implementacija softvera. Sljedeći primjer pokazuje rad takvog programskog koda.

Listing 1.3. Primjer kompajliranja pojedinačnih programskih blokova.

#include
#define SQUARE
int main()
{
int s = 0;
dužina int = 10;
int širina = 5;

#ifdef SQUARE
s=dužina*širina;
#else
s=2*(dužina+širina);
#endif

Povratak 0;
}

IN u ovom primjeru Izračunava se ili površina pravokutnika ili njegov perimetar, ovisno o tome da li je vrijednost KVADRAT definirana ili ne. Program podrazumevano izračunava površinu pravougaonika, ali ako uklonite #define SQUARE liniju, program će izračunati njegov perimetar.

Direktiva #include koja se koristi u gornjim primjerima omogućava vam da dodate prethodno napisane programe i sačuvate ih kao datoteke u program. Na primjer, linija

#include < stdio.h >

kaže pretprocesoru da doda sadržaj stdio.h umjesto date linije. To daje veću fleksibilnost, lakoću programiranja i vidljivost. generirani tekst programe. Postoje dvije vrste direktive #include:

#include < stdio.h > - naziv datoteke u uglastim zagradama

#include "mylib.h" - naziv datoteke u navodnicima

Ugaone zagrade govore pretprocesoru da traži datoteku (u u ovom slučaju stdio.h) u jednom ili više standardnih sistemskih direktorija. Navodnici označavaju da predprocesor prvo mora potražiti datoteku u trenutnom direktoriju, tj. gdje se datoteka nalazi kreiran program, pa tek onda pretraživati ​​u standardnim katalozima.

U ovom članku ćemo nastaviti da razumijemo umjetnost programiranja u C++. U ovom trenutku u vodiču, vrijeme je da se upoznate sa stvarima kao što su direktive pretprocesora. Gledajući unaprijed, reći ću da smo u prethodnim lekcijama već koristili direktivu #include, koji se koristi za uključivanje datoteka zaglavlja.

Prvo, hajde da definišemo šta je pretprocesor. Kompilacija bilo kojeg programa odvija se u nekoliko faza, a jedna od prvih je obrada od strane pretprocesora. Ako razgovaramo jednostavnim riječima, tada je predprocesor program koji čita izvor program i mijenja ga na osnovu direktiva. Šematski se cijeli proces izgradnje programa može predstaviti na sljedeći način.

Kao što možete vidjeti prije kompilacije originalni tekst Program obrađuje pretprocesor, pogledajmo bliže njegove upute.

Počnimo s #include direktivom, koju zamjenjuje pretprocesor sa sadržajem datoteke koja slijedi. Primjer korištenja #include:

#include

#include "header2.h"

Ako je ime datoteke zatvoreno u uglaste zagrade, tada pretprocesor traži datoteku na unaprijed definiranoj lokaciji. Upotreba dvostrukih zagrada uključuje uključivanje datoteke iz istog direktorija u kojem se nalazi izvorni kod kompajliranog programa. Također je vrijedno napomenuti da uključene datoteke također mogu sadržavati direktive predprocesora, posebno direktivu #include, tako da mogu nastati problemi sa višestruke veze isti fajl. Da bi se izbjegla ovakva zabuna, uvedene su uvjetne direktive, pogledajmo primjer njihove upotrebe:

#ifndef CUCUMBLER_H

#define CUCUMBLER_H

/* sadržaj datoteke cucumbler.h */

Direktiva #ifndef provjerava da li je konstanta CUCUMBLER_H prethodno definirana, a ako je odgovor negativan, onda se izvršava definicija ove konstante i drugog koda koji slijedi prije #endif direktive. Kao što možete pretpostaviti, #define direktiva definira konstantu CUCUMBLER_H. U ovom slučaju, takav komad koda pomaže da se izbjegne ponovljeno uključivanje istog koda, jer se nakon prvog uključivanja inicijalizira konstanta CUCUMBLER_H i sljedeće #ifndef CUCUMBLER_H provjere će vratiti FALSE.

Direktiva #define se takođe široko koristi prilikom otklanjanja grešaka u programu.

#include

#include

#include

korištenje imenskog prostora std;

cout<< "Начало функции main()\n";

vektor text_array;

dok (cin >> tekst)

cout<< "Прочитан текст: " << text << "\n";

text_array.push_back(tekst);

Ako konstanta IN_DEBUG nije navedena, predprocesor će generirati sljedeći izvor:

#include

#include

#include

korištenje imenskog prostora std;

vektor text_array;

dok (cin >> tekst)

text_array.push_back(tekst);

Ali ako definirate IN_DEBUG, tekst programa će se radikalno promijeniti

#include

#include

#include

korištenje imenskog prostora std;

cout<< "Начало функции main()\n";

vektor text_array;

dok (cin >> tekst)

cout<< "Прочитан текст: " << text << "\n";

text_array.push_back(tekst);

Možete postaviti konstantu predprocesora direktno sa konzole. Na primjer, g++ kompajler koristi sljedeći format

#include

Direktiva #include umeće kod iz navedene datoteke u trenutnu datoteku, odnosno jednostavnim uključivanjem druge datoteke, možemo koristiti njene funkcije, klase i varijable. Datoteke zaglavlja se obično nalaze ili u trenutnom direktoriju ili u standardnom sistemskom direktoriju.

Uključivanje datoteka zaglavlja vrši se u vrijeme kompajliranja ili kao datoteka koja je dio vašeg projekta. Ova funkcija ovisi o specifičnoj implementaciji vašeg kompajlera, tako da za više detalja kopajte u postavkama kompajlera.

Ako uključena datoteka nije pronađena, proces kompilacije ne uspijeva uz grešku.

#define direktiva

Direktiva #define ima dva oblika:

  • definicija konstanti;
  • definicija makroa.
Definicija konstanti
#define vrijednost nameTokena

Kada koristite konstantu name - nameToken, ona će biti zamijenjena vrijednošću, odnosno, grubo govoreći, ovo je ista varijabla čija se vrijednost ne može mijenjati. Pogledajmo primjer korištenja konstante:

#include #define TEKST "Mars" // definicija konstante int main() ( std::cout<< TEXT; return 0; }

Kao što vidite, da bismo pristupili vrijednosti konstante, jednostavno koristimo njeno ime.

Definiranje parametriziranih makroa

#define nameMacros(arg1, arg2, ...) izraz

Na primjer, hajde da definiramo makro koji će vratiti najviše dvije vrijednosti.

#define MAX(br.1, br.2) ((broj1) > (broj2) ? (broj1) : (broj2))

Pažnja, da bi se definirao višeredni makro, svaki red mora imati simbol na kraju, koji govori pretprocesoru da makro još nije završen.

#undef direktiva

Direktiva #undef nadjačava konstantni ili predprocesorski makro koji je prethodno definiran korištenjem direktive #define.

#undef nameToken

Pogledajmo primjer korištenja #undef direktive:

#define E 2.71828 // prethodno definirani makro int sumE = E + E; // pozivanje makroa #undef E // sada E nije makro

Tipično, #undef direktiva se koristi za uklanjanje prethodno definirane konstante ili makroa iz malog područja programa. To se radi tako da za cijeli program ostane makro ili konstanta, ali se za određeno područje isti makro ili konstanta može redefinirati. Bilo bi nesigurno redefinirati konstantu kroz program, ali u kratkom području, relativno je sigurno. Direktiva #undef je jedini način da se kreira ovaj opseg, budući da se opseg makronaredbi ili konstanti proteže od #define do #undef .

#if direktiva

#if value // kod koji će se izvršiti ako je vrijednost istinita #elsif value1 // ovaj kod će se izvršiti ako je vrijednost1 true #else // kod koji će se izvršiti u suprotnom #endif

Direktiva #if provjerava da li je vrijednost istinita i, ako jeste, izvršava kod koji dolazi prije završne #endif direktive. U suprotnom, kod unutar #if neće prevesti, kompajler će ga ukloniti, ali to neće uticati na originalni kod u izvornom kodu.

Imajte na umu da #if može imati ugniježđene direktive #elsif i #else. Ispod je primjer koda za komentiranje blokova koda koristeći sljedeću konstrukciju:

#if 0 // kod koji treba prokomentirati #endif

Ako imate blokove koda u svom programu koji sadrže komentare u više redaka i trebate umotati cijeli ovaj blok koda u komentar, ništa neće raditi ako koristite /*komentar u više redaka*/ . Druga stvar je konstrukcija #if #endif direktiva.

#ifdef direktiva

#ifdef nameToken // kod koji će se izvršiti ako je nameToken definiran #else // kod koji će se izvršiti ako nameToken nije definiran #endif

Direktiva #ifdef provjerava da li je makro ili simbolička konstanta prethodno definirana kao #define. Ako je odgovor da, kompajler uključuje u program kod koji se nalazi između #ifdef i #else direktiva, ako nameToken nije prethodno definiran, tada se izvršava kod između #else i #endif, ili, ako ne postoji #else direktive, kompajler odmah ide na # endif. Na primjer, __cpp makro je definiran u C++, ali ne u C. Možete koristiti ovu činjenicu da pomiješate C i C++ kod koristeći #ifdef direktivu:

#ifdef __cpp // C++ kod #else // C kod #endif

#ifndef direktiva

#ifndef nameToken // kod koji će se izvršiti ako nameToken nije definiran #else // kod koji će se izvršiti ako je nameToken definiran #endif

Direktiva #ifndef provjerava da li je makro ili simbolička konstanta prethodno definirana kao #define. Ako da, kompajler uključuje u program kod koji se nalazi između #else i #endif direktiva, ako nameToken nije prethodno definiran, tada se izvršava kod između #ifndef i #else, ili, ako ne postoji #else direktiva , kompajler odmah ide na # endif. Direktiva #ifndef se može koristiti za uključivanje datoteka zaglavlja. ako nisu povezani, koristite simboličku konstantu da to učinite kao indikator funkcionalnosti povezane s projektom.

Na primjer, u datoteci zaglavlja postoji sučelje klase koje treba povezati s projektom ako ova klasa nije prethodno bila povezana.

#ifndef PRODUCT_H #define PRODUCT_H klasa Proizvod ( // kod klase... ); #endif PRODUCT_H

U ovom slučaju se koristi prazna simbolička konstanta PRODUCT_H, koja se može definirati samo u programu zajedno s klasom Product. Stoga, ako utvrdimo da je konstanta PRODUCT_H već definirana, onda je i klasa, a onda ćemo eliminirati ponovnu definiciju klase, što može dovesti do greške prevladavanja.

#error direktiva

#error "Ovaj kod ne bi trebao kompajlirati"

Direktiva #error vam omogućava da prikažete poruku na listi grešaka kompilacije ako dođe do odgovarajuće greške. Ova direktiva je najkorisnija kada se koristi u kombinaciji sa #if , #elsif , #else direktivama za provjeru kompilacije ako neki uvjet nije istinit. Na primjer:

#ifndef __unix__ // __unix__ je obično podržan na Unix sistemima #error "Podržano samo na Unixu" #endif

Makro predprocesora __FILE__

Makro predprocesora __FILE__ proširuje se na punu putanju do trenutnog fajla (izvora). __FILE__ je koristan za kreiranje datoteke dnevnika, generiranje poruka o grešci za programere i kod za otklanjanje grešaka.

Int greška (const char* adrFile, const std::string& erMessage) (cerr<< "[" << adrFile << "]" << arMessage << endl; } #define LOG(erMessage) error(__FILE__, arMessage) // макрос LOG может быть использован для получения сообщений об ошибках, которые выводятся на стандартный поток ошибок

Makro __FILE__ se često koristi zajedno sa makroom __LINE__, koji daje trenutni broj reda.

Makro predprocesora __LINE__

Makro __LINE__ se proširuje na trenutni broj reda u izvornom fajlu, kao cjelobrojna vrijednost. __LINE__ je koristan prilikom kreiranja datoteke dnevnika ili generiranja poruka o grešci u broju reda za programere za otklanjanje grešaka koda.

Int greška (int nLine, const std::string& erMessage) (cerr<< "[" << nLine << "]" << erMessage << endl; } #define LOG(erMessage) error(__LINE__, erMessage) // макрос LOG может быть использован для получения сообщений об ошибках, с указанием номеров строк, которые выводятся на стандартный поток ошибок

Makro __LINE__ se često koristi zajedno sa makroom __FILE__, koji pokazuje adresu trenutnog izvornog fajla.

Makro za pretprocesor __DATE__

Makro __DATE__ proširuje se na trenutni datum (vrijeme kompajliranja) kao [mmm dd gggg] (na primjer, „7. decembar 2012″“) kao niz. __DATE__ se može koristiti za pružanje informacija o vremenu kompajliranja.

Cout<< __DATE__ << endl;

Također možete koristiti makro __TIME__ da dobijete trenutno vrijeme kompajliranja.

Makro predprocesora __TIME__

Makro __TIME__ proširuje se u trenutno vrijeme (vrijeme kompajliranja) u formatu hh:mm:cc u 24-satnom satu (na primjer, “22:29:12″). Makro __TIME__ može se koristiti za pružanje informacija o vremenu u određenoj tački kompilacije.

Cout<< __TIME__ << endl;

Makro predprocesora __TIMESTAMP__

Makro __TIMESTAMP__ se proširuje u trenutno vrijeme (vrijeme kompajliranja) u formatu Ddd Mmm Datum hh::mm::ss gggg, vrijeme u 24-satnom formatu:

  • Ddd je skraćenica za dan u sedmici.
  • mmm ovo je skraćeni mjesec,
  • Datum — tekući dan u mjesecu (1-31),
  • gggg je četverocifrena godina.

Na primjer, "pet 7. decembar 00:42:53 2012." . Makro __TIMESTAMP__ može se koristiti za dobivanje informacija o datumu i vremenu kompilacije.

Cout<< __TIMESTAMP__ << endl;

Također možete koristiti makro __TIME__ da dobijete trenutno vrijeme kompajliranja i makro __DATE__ da dobijete datum.

#pragma direktiva

#pragma specifična ekstenzija za kompajler

Direktiva #pragma se koristi za pristup ekstenzijama specifičnim za kompajler. Upotreba #pragma direktive zajedno sa tokenom jednom traži od kompajlera da uključi datoteku zaglavlja samo jednom, bez obzira koliko puta je uvezena:

#pragma jednom // datoteka zaglavlja

U ovom primjeru, direktiva #pragma jednom sprječava da se datoteka više puta uključi u projekt, tj. sprječava nadjačavanje.

Direktiva #pragma se također može koristiti u druge svrhe, na primjer #pragma se obično koristi za potiskivanje upozorenja. Na primjer, u MVS:

#pragma upozorenje (onemogućeno: 4018)

Direktiva #pragma u ovom primjeru se koristi za suzbijanje upozorenja 4018. Za dodatne upotrebe direktive #pragma, pogledajte dokumentaciju vašeg kompajlera.

Makro operator #

#

Operator # stavlja tekstualni token u niz navodnika. Pogledajmo primjer:

#include korištenje imenskog prostora std; #define poruka(e) cout<< "Сообщение: " #s << endl; int main() { message("GunGame"); return 0; }

Izvršava se konkatenacija nizova i makro poruke se proširuje na cout<< "Сообщение: GunGamen"; . Обратите внимание на то, что операция # должна использоваться совместно с аргументами, так как # ссылается на аргумент.

Makro operater ##

Operator ## uzima dva odvojena tokena i lijepi ih ​​zajedno da formiraju jedan makro. Rezultat može biti ime varijable, ime klase ili bilo koji drugi identifikator. Na primjer:

#define type ch##ar type a; // varijabla a je tip podataka char, budući da su ch i ar spojeni u char

Pogledajmo još jedan primjer korištenja ## operatora, u kojem kombiniramo dva tokena:

#define TOKENCONCAT(x,y) x##y

Kada program pozove ovaj makro, dva tokena se kombinuju u jedan. Operacija ## mora imati dva operanda.

P.S.: Svaki ozbiljan program mora imati svoju bazu podataka, obično se za upravljanje bazom koriste sljedeći DBMS: MySQL, MsSQL, PostgreeSQL, Oracle itd. Prilikom instaliranja sql servera, forum na cyberforum.ru će vam biti nezaobilazan pomoćnik . Postavite svoja pitanja na ovom forumu, sigurno će vam pomoći u rješavanju vašeg problema.

preprocesor Svrha pretprocesora je da obradi izvorni tekst programa prije nego što ga kompajlira. Predobrada uključuje nekoliko faza koje se izvode uzastopno. Određena implementacija može kombinirati nekoliko faza, ali rezultat mora biti kao da su izvedene sljedećim redoslijedom:
  1. Sve oznake koje zavise od sistema se prekodiraju u standardne kodove.
  2. Svaki par znakova "\" i "kraj reda", zajedno sa razmacima između njih, se uklanjaju i tako se sljedeći red izvornog teksta dodaje redu u kojem se nalazi ovaj par znakova.
  3. Preprocesorske direktive i tokeni se prepoznaju u tekstu, a svaki komentar se zamjenjuje jednim znakom razmaka.
  4. Izvršavaju se direktive pretprocesora i izvode se zamjene makroa.
  5. Escape sekvence u znakovnim konstantama i znakovnim nizovima zamjenjuju se njihovi ekvivalenti.
  6. Susedni nizovi znakova su spojeni, odnosno spojeni u jedan niz.
  7. Svaki predprocesorski token se pretvara u C tekst.

Hajde da objasnimo šta se podrazumeva pod predprocesorskim tokenima ili predprocesorskim tokenima. To uključuje konstante znakova, uključuje nazive datoteka, identifikatore, znakove operacija, brojeve pretprocesora, znakove interpunkcije, konstante niza i sve znakove osim razmaka.

Faza obrade predprocesorskih direktiva. Prilikom ovog izvođenja moguće su sljedeće radnje:

  • zamjena identifikatora unaprijed pripremljenim nizovima znakova;
  • uključivanje tekstova iz određenih datoteka u program;
  • isključivanje iz programa pojedinih delova njegovog teksta, uslovno sastavljanje;
  • makro supstitucija, odnosno zamjena oznake parametriziranim tekstom koji generiše pretprocesor uzimajući u obzir specifične argumente.

Simboličke konstante: #define

Ako je prvi znak u programskoj liniji #, onda je i taj red komandna linija predprocesor (makroprocesor). Komandna linija pretprocesor završava znakom novog reda. Ako stavite obrnutu kosu crtu "\" neposredno prije kraja reda, onda komandna linija nastavit će se na sljedeći red programa.

Direktiva #define, kao i sve direktive preprocesora, počinje znakom # na krajnjoj lijevoj poziciji. Može se pojaviti bilo gdje u izvornom fajlu, a data definicija je važeća od mjesta gdje se pojavljuje do kraja datoteke. Aktivno koristimo ovu direktivu za definiranje simboličke konstante u našim primjerima programa, međutim, ima šire primjene, što ćemo pokazati sljedeće.

Zamjena identifikatora

#define identifikator niza

Zamjenjuje svako pojavljivanje ABC identifikatora u tekstu programa sa 100:

#undef identifikator

Nadjačava prethodnu definiciju za ABC identifikator.

/* Jednostavni primjeri direktive preprocesora */ #define TWO 2 /* mogu se koristiti komentari */ #define MSG "Tekst 1.\ Tekst 1 nastavak" /* obrnuta kosa crta nastavlja definiciju na sljedeći red */ #define FOUR TWO *TWO # define PX printf("X je jednako %d.\n", x) #define FMT "X je jednako %d.\n" int main() ( int x = DVA; PX; x = ČETIRI ; printf(FMT,x) ; printf("%s\n",MSG); printf("TWO: MSG\n"); vrati DVA; )

Kao rezultat izvođenja našeg primjera, imat ćemo.

Posljednje ažuriranje: 22.05.2017

Pretprocesor je obavezna komponenta kompajlera jezika C. Predprocesor obrađuje izvorni kod programa prije nego što se direktno kompajlira. Rezultat rada predprocesora je puni tekst programa, koji se prenosi za kompilaciju u izvršnu datoteku.

Za kontrolu pretprocesora koriste se direktive, od kojih svaka počinje heš znakom # i nalazi se u zasebnom redu. Predprocesor skenira tekst programa, pronalazi ove direktive i pravilno ih obrađuje.

Možemo koristiti sljedeće direktive:

    #define : definira makro ili identifikator predprocesora

    #undef : dedefinira makro ili identifikator

    #ifdef : provjerava je li definiran identifikator

    #ifndef : provjerava nedefinirani identifikator

    #include : uključuje tekst iz datoteke

    #if : testira uslov izraza (kao ako uslovno)

    #else : specificira alternativni uslov za #if

    #endif : kraj uslovne #if direktive

    #elif : specificira alternativni uslov za #if

    #line : mijenja broj sljedećeg reda ispod

    #error : generira tekst poruke o grešci u prijevodu

    #pragma : definira akcije koje zavise od specifične implementacije kompajlera

    # : prazna direktiva, u suštini ne radi ništa

Pogledajmo glavne od ovih direktiva.

#include direktiva. Uključujući fajlove

Direktiva #include je već korištena ranije. Ova direktiva uključuje datoteke u izvornom tekstu. Ima sljedeće oblike prijave:

#include<имя_файла>// ime datoteke u uglatim zagradama #include "file_name" // ime datoteke u navodnicima

Na primjer, ako trebamo omogućiti I/O konzole u aplikaciji pomoću funkcija printf() ili scanf(), tada moramo uključiti datoteku “stdio.h”, koja sadrži definiciju ovih funkcija:

#include

Kada se ova direktiva izvrši, predprocesor ubacuje tekst datoteke stdio.h. Ova datoteka se također naziva datoteka zaglavlja. Datoteke zaglavlja sadrže prototipove funkcija, definicije i opise tipova i konstanti i imaju ekstenziju .h.

Datoteka se traži u standardnim sistemskim direktorijumima. Općenito, postoji standardni skup ugrađenih datoteka zaglavlja, koje su definirane jezičkim standardom i koje možemo koristiti:

    assert.h: odgovoran za dijagnostiku programa

    complex.h : za rad sa kompleksnim brojevima

    ctype.h: odgovoran za konverziju znakova i provjeru

    errno.h: odgovoran za provjeru grešaka

    fenv.h : za pristup okruženju koje rukuje operacijama s pomičnim zarezom

    float.h : odgovoran za rad sa brojevima s pomičnim zarezom

    inttypes.h : za rad s velikim cijelim brojevima

    iso646.h: sadrži brojne definicije koje proširuju niz logičkih operacija

    limits.h : Sadrži ograničenja za cjelobrojne tipove

    locale.h: odgovoran za rad s lokalnom kulturom

    math.h : za rad sa matematičkim izrazima

    setjmp.h : Definira ne-lokalne mogućnosti skoka

    signal.h : za rukovanje izuzetkom

    stdalign.h : za poravnanje tipa

    stdarg.h: pruža podršku za promjenjivi broj parametara

    stdatomic.h: za izvođenje atomskih operacija nad zajedničkim podacima između niti

    stdbool.h : za rad sa tipom _Bool

    stddef.h: sadrži niz pomoćnih definicija

    stdint.h : za rad sa cijelim brojevima

    stdio.h : za rad sa I/O objektima

    stdlib.h: sadrži definicije i prototipove javnih funkcija

    stdnoreturn.h : sadrži makronaredbu noreturn

    string.h : za rad sa stringovima

    tgmath.h : povezuje math.h i complex.h plus dodaje dodatne mogućnosti za rad sa matematičkim proračunima

    threads.h : za rad sa nitima

    time.h : za rad sa datumima i vremenima

    uchar.h : za rad sa Unicode znakovima

    wchar.h : za rad sa likovima

    wctype.h: sadrži dodatne mogućnosti za rad sa likovima

Međutim, vrijedno je napomenuti da se u različitim okruženjima ovom skupu mogu dodati dodatne ugrađene datoteke zaglavlja za određene svrhe, na primjer, za rad s grafikom.

Pored standardnih datoteka zaglavlja, možemo uključiti i naše vlastite datoteke. Na primjer, u istom folderu u kojem se nalazi glavni programski fajl, definirat ćemo još jedan fajl koji ćemo nazvati main.c. Definirajmo sljedeći kod u njemu:

Int broj = 5;

Ovdje je jednostavno definirana jedna varijabla. Sada uključimo ovaj fajl u program:

#include #include "main.c" int main(void) ( printf("%d", broj); // 5 vraća 0; )

Prilikom povezivanja vaših datoteka, njihovo ime je navedeno u navodnicima. I uprkos činjenici da varijabla broj nije definirana u programu, ona će biti preuzeta iz uključene main.c datoteke. Ali opet, napominjem da je važno da se u ovom slučaju datoteka main.c nalazi u istom folderu kao i glavni programski fajlovi.

Istovremeno, ova metoda odlično funkcionira u GCC-u. Ali za različita programska okruženja, način povezivanja datoteka može se razlikovati. Na primjer, u Visual Studio-u ćemo dobiti grešku. A ispravniji pristup bi bio da se definiše deklaracija objekta (varijabla/konstanta) ili funkcije u dodatnom zaglavlju i postavi definicija objekta ili funkcije u standardnu ​​datoteku sa ekstenzijom .c.

Na primjer, u našoj main.c datoteci već postoji definicija varijable broja. Sada dodajmo novu datoteku main.h u isti folder - datoteku sa istim imenom, ali drugom ekstenzijom. I definirajte sljedeći kod u main.h:

Eksterni int broj;

Ključna riječ extern označava da je ovaj objekt vanjski. I u ovom slučaju, mogli bismo ga uključiti u datoteku izvornog koda:

#include #include "main.h" // deklaracija ili opis objekta #include "main.c" // definicija objekta int main(void) ( printf("%d", number); return 0; )

Ovaj primjer će također raditi u GCC-u, međutim, kao što je gore objašnjeno, uključujući main.h datoteku za GCC nije obavezno.

Ako se razvoj odvija u Visual Studio, tada definicija objekta ne mora uključivati ​​izvorni fajl:

#include #include "main.h" // deklaracija ili opis objekta int main(void) ( printf("%d", number); return 0; )

Uprkos činjenici da datoteka main.c ovdje nije eksplicitno uključena, Visual Studio će prilikom emitiranja moći uključiti datoteku main.c koja se nalazi u istom folderu kroz datoteku zaglavlja main.h.

Najbolji članci na ovu temu