Kako postaviti pametne telefone i računala. Informativni portal
  • Dom
  • Programi
  • Svrha direktive o pretprocesoru uključuje. C direktive za pretprocesor

Svrha direktive o pretprocesoru uključuje. C direktive za pretprocesor

Gotovo svi C ++ programi koriste posebne naredbe za kompajler koje se nazivaju direktivama. Općenito, direktiva je instrukcija prevodiocu C ++ da izvrši akciju u vrijeme kompilacije programa. Postoji dobro definiran skup mogućih direktiva, koji uključuje sljedeće definicije:

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

Direktiva #define koristi se za postavljanje konstanti, ključnih riječi, operatora i izraza koji se koriste u programu. Opća sintaksa za ovu direktivu je sljedeća:

Treba napomenuti da se simbol ';' ne stavlja iza direktiva. Ovdje su primjeri slučajeva upotrebe direktive #define.

Listing 1.2. Primjeri korištenja direktive #define.

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

Vrati 0;
}

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

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

Direktiva #undef nadjačava definiciju koju je ranije uvela direktiva #define. Pretpostavimo da u nekom dijelu programa trebate poništiti definiciju konstante FOUR. To se postiže sljedećom naredbom:

Zanimljiva značajka ove direktive je mogućnost nadjačavanja vrijednosti prethodno uvedene konstante. Doista, ponovna upotreba direktive #define za prethodno uvedenu konstantu FOUR je nemoguća, budući da to će rezultirati porukom o pogrešci u vrijeme kompilacije programa. Ali ako poništite definiciju konstante FOUR koristeći #undef direktivu, tada postaje moguće ponovno koristiti #define direktivu za konstantu FOUR.

Kako bi se moglo izvršiti uvjetno prevođenje, koristi se skupina direktiva #if, #ifdef, #ifndef, #elif, #else i #endif. Program u nastavku povezat će knjižnice na temelju konstanti koje postavite.

#ako je definirano (GRAF)
#elif definiran (TEXT)
#drugo
#završi ako

Ovaj program radi na sljedeći način. Ako je konstanta pod nazivom GRAPH prethodno postavljena putem #define direktive, tada će grafička knjižnica biti uključena pomoću #include direktive. Ako GRAPH nije definiran, ali je definiran TEXT, tada će se koristiti tekstualna I/O knjižnica. Inače, u nedostatku ikakvih definicija, uključena je I/O knjižnica. Umjesto izraza #if definiran, često se koriste kratice #ifdef i #ifndef, a gornji se program može prepisati kao:

#ifdef GRAF
#include // uključi grafičku biblioteku
#ifdef TEKST
#include // uključuje biblioteku teksta
#drugo
#include // uključi I/O biblioteku
#završi ako

Razlika između direktive #if i direktiva #ifdef i #ifndef leži u mogućnosti provjere raznovrsnijih uvjeta, a ne samo u tome postoje li konstante ili ne. Na primjer, pomoću direktive #if možete provjeriti:

#ako VELIČINA == 1
#include // uključi matematičku biblioteku
#elif VELIČINA> 1
#include // povezivanje biblioteke za obradu polja
#završi ako

U danom primjeru je povezana ili matematička knjižnica ili knjižnica za obradu polja, ovisno o vrijednosti konstante SIZE.

Te se direktive ponekad koriste za isticanje potrebnih programskih blokova koji se trebaju koristiti u određenoj softverskoj implementaciji. Sljedeći primjer pokazuje kako ovaj kod radi.

Listing 1.3. Primjer sastavljanja pojedinačnih blokova programa.

#uključiti
#definiraj KVADRAT
int main ()
{
int s = 0;
dužina int = 10;
int širina = 5;

#ifdef KVADRAT
s = duljina * širina;
#drugo
s = 2 * (duljina + širina);
#završi ako

Vrati 0;
}

Ovaj primjer izračunava ili površinu pravokutnika ili njegov perimetar, ovisno o tome je li vrijednost KVADRAT definirana ili ne. Prema zadanim postavkama, program izračunava površinu pravokutnika, ali ako uklonite #define SQUARE liniju, program će izračunati njegov opseg.

Direktiva #include korištena u gornjim primjerima omogućuje vam dodavanje prethodno napisanih programa i spremljenih kao datoteke u program. Na primjer, linija

#include & lt stdio.h>

govori predprocesoru da doda sadržaj stdio.h datoteke umjesto danog retka. To daje veliku fleksibilnost, jednostavnost programiranja i jasnoću generiranog teksta programa. Postoje dvije vrste direktive #include:

#include & lt stdio.h> - naziv datoteke u kutnim zagradama

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

Kutne zagrade govore predprocesoru da potraži datoteku (u ovom slučaju stdio.h) u jednom ili više standardnih direktorija sustava. Navodnici označavaju da predprocesor prvo mora tražiti datoteku u trenutnom direktoriju, tj. gdje se nalazi datoteka kreiranog programa, a tek onda - pretražite u standardnim imenicima.

U ovom članku nastavit ćemo shvaćati umjetnost programiranja u jeziku 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 #uključiti, koji služi za uključivanje datoteka zaglavlja.

Prvo, definirajmo što je pretprocesor. Kompilacija bilo kojeg programa odvija se u nekoliko faza, a jedna od prvih je predobrada. Jednostavno rečeno, predprocesor je program koji čita izvorni kod programa i mijenja ga na temelju direktiva. Cijeli proces izgradnje programa može se shematski prikazati na sljedeći način.

Kao što možete vidjeti, neposredno prije kompilacije, izvorni kod programa obrađuje predprocesor, pogledajmo pobliže njegove upute.

Počnimo s #include direktivom, koju zamjenjuje pretprocesor sa sadržajem datoteke koja slijedi. Primjer pomoću #include:

#uključiti

#include "header2.h"

Ako je naziv datoteke u kutnim zagradama, tada pretprocesor traži datoteku na unaprijed definiranom mjestu. Korištenje dvostrukih zagrada pretpostavlja da je datoteka povezana iz istog direktorija u kojem se nalazi izvorni kod prevedenog programa. Također je vrijedno napomenuti da uključene datoteke također mogu sadržavati predprocesorske direktive, posebno direktivu #include, tako da može doći do problema s višestrukim povezivanjem iste datoteke. Kako bi se izbjegla ovakva zabuna, uvedene su uvjetne direktive, pogledajmo primjer njihove uporabe:

#ifndef CUCUMBLER_H

#define CUCUMBLER_H

/ * sadržaj datoteke cucumbler.h * /

Direktiva #ifndef provjerava je li konstanta CUCUMBLER_H definirana ranije, a ako je odgovor negativan, tada se izvodi 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 dio koda pomaže da se izbjegne višestruko uključivanje istog koda, budući da će nakon prvog uključivanja konstanta CUCUMBLER_H biti inicijalizirana, a sljedeće #ifndef CUCUMBLER_H provjere će vratiti FALSE.

Direktiva #define također se široko koristi prilikom otklanjanja pogrešaka u programu.

#uključiti

#uključiti

#uključiti

korištenje imenskog prostora std;

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

vektor tekst_niz;

dok (cin >> tekst)

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

text_array.push_back (tekst);

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

#uključiti

#uključiti

#uključiti

korištenje imenskog prostora std;

vektor tekst_niz;

dok (cin >> tekst)

text_array.push_back (tekst);

Ali ako definirate IN_DEBUG, tekst programa će se dramatično promijeniti

#uključiti

#uključiti

#uključiti

korištenje imenskog prostora std;

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

vektor tekst_niz;

dok (cin >> tekst)

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

text_array.push_back (tekst);

Možete postaviti konstantu predprocesora izravno s konzole. Na primjer, za kompajler g ++ koristi se sljedeći format

#uključiti

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

Datoteke zaglavlja uključene su u vrijeme prevođenja ili kao datoteka koja je dio vašeg projekta. Ova funkcija ovisi o specifičnoj implementaciji vašeg kompajlera, tako da više detalja potražite u postavkama kompajlera.

Ako uključena datoteka nije pronađena, proces kompilacije neće uspjeti.

#Definirajte direktivu

Direktiva #define ima dva oblika:

  • definicija konstanti;
  • definicija makronaredbi.
Definiranje konstanti
#define vrijednost nameTokena

Kada koristite naziv konstante - nameToken, bit će zamijenjen vrijednosnom vrijednošću, odnosno, grubo govoreći - to je ista varijabla čija se vrijednost ne može mijenjati. Pogledajmo primjer korištenja konstante:

#uključiti #define TEKST "Mars" // definiraj konstantu int main () (std :: cout<< TEXT; return 0; }

Kao što možete vidjeti, da bismo pristupili vrijednosti konstante, jednostavno koristimo njezin naziv.

Definiranje parametriziranih makronaredbi

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

Na primjer, definirajmo makronaredbu koja će vratiti najviše dvije vrijednosti.

#define MAX (num1, num2) ((num1)> (num2)? (num1): (num2))

Pažnja, za definiranje makronaredbe s više redaka, u svakom retku, na kraju, mora se staviti simbol koji obavještava predprocesor da makronaredba još nije dovršena.

#Undef direktiva

Direktiva #undef nadjačava konstantnu ili pretprocesorsku makronaredbu prethodno definiranu pomoću direktive #define.

#undef nameToken

Pogledajmo primjer korištenja direktive #undef:

#define E 2.71828 // ranije definirana makronaredba int sumE = E + E; // poziv makronaredbi #undef E // sada E nije makronaredba

Obično se direktiva #undef koristi za poništavanje prethodno definirane konstante ili makronaredbe u malom području programa. To se radi tako da za cijeli program ostane makro ili konstanta, a da se za određeno područje ista makro ili konstanta može redefinirati. Ne bi bilo sigurno nadjačati konstantu kroz program, ali u kratkom opsegu, relativno je sigurno. Direktiva #undef jedini je način za stvaranje ovog opsega, budući da se opseg makronaredbi ili konstanti kreće od #define do #undef.

#Ako 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 je li vrijednost istinita i, ako jest, izvršava se kod prije zatvaranja #endif direktive. Inače, kod unutar #if neće prevesti, kompajler će ga ukloniti, ali to ne utječe na izvorni kod u izvoru.

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

#if 0 // kod za komentiranje #endif

Ako u svom programu imate blokove koda koji sadrže komentare s više redaka i trebate cijeli blok koda zamotati u komentar, ništa neće raditi ako koristite / * višeredni komentar * /. 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 je li makro ili simbolička konstanta prethodno definirana kao #define. Ako - da, prevodilac uključuje u program kod koji se nalazi između direktiva #ifdef i #else, ako nameToken nije prethodno definiran, tada se izvršava kod između #else i #endif, ili, ako ne postoji #else direktive, prevodilac odmah ide na # endif. Na primjer, makronaredba __cpp definirana je u C ++, ali ne u C. Ovu činjenicu možete koristiti za miješanje koda C i C ++ pomoću #ifdef direktive:

#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 je li makro ili simbolička konstanta prethodno definirana kao #define. Ako je odgovor da, prevodilac uključuje u program kod koji se nalazi između direktiva #else i #endif, ako nameToken nije prethodno definiran, tada se izvršava kod između #ifndef i #else, ili, ako ne postoji #else direktiva , prevodilac odmah skače na # endif. Direktiva #ifndef može se koristiti za uključivanje datoteka zaglavlja. ako nisu povezani, za to koristite simboličku konstantu kao pokazatelj funkcionalnosti povezane s projektom.

Na primjer, datoteka zaglavlja sadrži sučelje klase koje mora biti povezano s projektom ako ova klasa nije prethodno bila povezana.

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

U ovom slučaju koristi se 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 isključiti redefiniranje klase, što može dovesti do pogreške nadjačavanja.

#Direktiva o grešci

#error "Ovaj kod ne bi trebao kompilirati"

Direktiva #error omogućuje vam da prikažete poruku na popisu pogrešaka kompilacije ako se pojavi odgovarajuća pogreška. Ova direktiva je najkorisnija u kombinaciji sa #if, #elsif, #else direktivama za provjeru kompilacije ako neki uvjet nije istinit. Na primjer:

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

__FILE__ makronaredba predprocesora

Makro predprocesora __FILE__ proširuje se na puni put do trenutne datoteke (izvora). __FILE__ je koristan za kreiranje datoteke dnevnika, generiranje poruka o pogreškama namijenjenih programerima, prilikom otklanjanja pogrešaka koda.

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

Makronaredba __FILE__ često se koristi zajedno s makronaredbom __LINE__ koja daje trenutni broj retka.

__LINE__ makronaredba predprocesora

Makronaredba __LINE__ proširuje se na trenutni broj retka u izvornoj datoteci kao cjelobrojna vrijednost. __LINE__ je koristan za generiranje datoteke dnevnika ili generiranje poruka o pogrešci broja redaka za programere prilikom otklanjanja pogrešaka koda.

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

Makronaredba __LINE__ često se koristi zajedno s makronaredbom __FILE__, koja prikazuje adresu trenutne izvorne datoteke.

__DATE__ makronaredba predprocesora

Makronaredba __DATE__ proširuje se na trenutni datum (vrijeme kompajliranja) kao [mmm dd gggg] (na primjer, "7. prosinca 2012."), kao niz. __DATE__ može se koristiti za pružanje informacija o vremenu prevođenja.

Cout<< __DATE__ << endl;

Također možete koristiti makronaredbu __TIME__ za dobivanje trenutnog vremena prevođenja.

__TIME__ makronaredba predprocesora

Makronaredba __TIME__ proširuje se u trenutačno vrijeme (vrijeme kompajliranja) u hh: mm: cc formatu u 24-satnom formatu (na primjer, "22:29:12"). Makronaredba __TIME__ može se koristiti za pružanje informacija o vremenu u određenoj točki kompilacije.

Cout<< __TIME__ << endl;

__TIMESTAMP__ makronaredba pretprocesora

Makronaredba __TIMESTAMP__ proširuje se u trenutačno vrijeme (vrijeme kompajliranja) u formatu Ddd Mmm Datum hh :: mm :: ss gggg, vrijeme u 24-satnom formatu:

  • Ddd je skraćeni dan u tjednu,
  • mmm ovo je skraćeno kao mjesec,
  • Datum - tekući dan u mjesecu (1-31),
  • yyyy su četiri znamenke godine.

Na primjer, "Pet 7. prosinca 00:42:53 2012.". Makronaredba __TIMESTAMP__ može se koristiti za dobivanje podataka o datumu i vremenu kompilacije.

Cout<< __TIMESTAMP__ << endl;

Također možete koristiti makronaredbu __TIME__ za dobivanje trenutnog vremena prevođenja i makronaredbu __DATE__ za dobivanje datuma.

#Pragma direktiva

#pragma specifično proširenje za kompajler

Direktiva #pragma koristi se za pristup specifičnim proširenjima kompajlera. Korištenje direktive #pragma s tokenom jednom traži od prevoditelja da uključi datoteku zaglavlja samo jednom, bez obzira koliko puta je uvezena:

#pragma jednom // datoteka zaglavlja

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

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

#pragma upozorenje (onemogućeno: 4018)

Direktiva #pragma u ovom primjeru koristi se za onemogućavanje upozorenja 4018. Za više korištenja direktive #pragma, pogledajte dokumentaciju vašeg prevoditelja.

Makro operator #

#

Operator # tekstualni token u nizu pod navodnicima. Pogledajmo primjer:

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

Spojite nizove i proširite makronaredbu poruke na cout<< "Сообщение: GunGamen"; . Обратите внимание на то, что операция # должна использоваться совместно с аргументами, так как # ссылается на аргумент.

Operator makronaredbe ##

Operator ## uzima dva odvojena tokena i lijepi ih ​​zajedno kako bi formirao jedan makro. Rezultat može biti ime varijable, naziv 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 zalijepljeni za char

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

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

Kada program pozove ovu makronaredbu, dva tokena se spajaju u jedan. Operacija ## mora imati dva operanda.

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

pretprocesor. Svrha predprocesora je obraditi izvorni kod programa prije nego što se prevede. Predobrada uključuje nekoliko faza koje se izvode uzastopno. Konkretna implementacija može kombinirati nekoliko faza, ali rezultat bi trebao biti kao da se izvršavaju sljedećim redoslijedom:
  1. Sve oznake koje ovise o sustavu pretvaraju se u standardne kodove.
  2. Svaki par znakova "\" i "kraj retka" zajedno s razmacima između njih se uklanjaju i tako se sljedeći redak izvornog teksta dodaje retku u kojem se nalazi ovaj par znakova.
  3. Smjernice i tokeni pretprocesora prepoznaju se u tekstu, a svaki komentar zamjenjuje se jednim znakom za razmak.
  4. Izvrše se direktive pretprocesora i izvode se zamjene makroa.
  5. Escape sekvence u znakovnim konstantama i znakovnim nizovima zamjenjuju se njihovim ekvivalentima.
  6. Susjedni nizovi znakova su spojeni, odnosno povezani u jedan niz.
  7. Svaki predprocesorski token se pretvara u C tekst.

Objasnimo što se podrazumijeva pod predprocesorskim tokenima ili predprocesorskim tokenima. To uključuje znakovne konstante, uključuje nazive datoteka, identifikatore, op oznake, brojeve predprocesora, interpunkcijske znakove, konstante niza i sve znakove osim razmaka.

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

  • zamjena identifikatora unaprijed pripremljenim nizovima znakova;
  • uključivanje tekstova iz navedenih datoteka u program;
  • isključenje iz programa pojedinih dijelova njegova teksta, uvjetno sastavljanje;
  • zamjena makroa, odnosno zamjena oznake parametriziranim tekstom koji generira pretprocesor uzimajući u obzir specifične argumente.

Simboličke konstante: #define

Ako se simbol # koristi kao prvi znak u retku programa, onda je ovaj redak naredbeni redak pretprocesor (makroprocesor). Naredbeni redak Predprocesor završava znakom novog reda. Ako stavite obrnutu kosu crtu "\" neposredno prije kraja retka, onda naredbeni redak nastavit će se na sljedeći redak programa.

Direktiva #define, kao i sve direktive pretprocesora, počinje s # na krajnjoj lijevoj poziciji. Može se pojaviti bilo gdje u izvornoj datoteci, a definicija je važeća od mjesta gdje se pojavljuje do kraja datoteke. Ovu direktivu aktivno koristimo za definiranje simboličke konstante u našim primjerima programa, međutim, ima širu primjenu, što ćemo pokazati sljedeće.

Zamjena identifikatora

#define id niz

Zamjenjuje svako pojavljivanje ABC identifikatora u tekstu programa sa 100:

#undef identifikator

Preokreće prethodnu definiciju za ABC identifikator.

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

Kao rezultat pokretanja našeg primjera, imat ćemo.

Posljednje ažuriranje: 22.05.2017

Predprocesor je obavezna komponenta C prevoditelja. Predprocesor obrađuje izvorni kod programa prije nego što ga izravno prevede. Rezultat rada predprocesora je cijeli tekst programa koji se šalje na kompilaciju u izvršnu datoteku.

Za upravljanje predprocesorom koriste se direktive, od kojih svaka počinje znakom hash # i nalazi se u zasebnom retku. Predprocesor skenira tekst programa, pronalazi te direktive i obrađuje ih na odgovarajući način.

Možemo koristiti sljedeće smjernice:

    #define: definira makro ili identifikator predprocesora

    #undef: Poništite definiranje makronaredbe ili identifikatora

    #ifdef: provjerava je li definiran id

    #ifndef: provjerava dvosmislenost identifikatora

    #include: uključuje tekst iz datoteke

    #if: testira izraz uvjeta (poput uvjetnog if naredbe)

    #else: postavlja alternativni uvjet za #if

    #endif: kraj uvjetne #if direktive

    #elif: postavlja alternativni uvjet za #if

    #line: mijenja broj sljedećeg retka ispod

    #error: generira tekst emitirane poruke o pogrešci

    #pragma: definira radnje koje ovise o specifičnoj implementaciji prevoditelja

    #: prazna direktiva, u biti ne radi ništa

Razmotrimo glavne od ovih direktiva.

#Uključi direktivu. Uključujući datoteke

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

#uključiti<имя_файла>// naziv datoteke u kutnim zagradama #include "file_name" // naziv datoteke u navodnicima

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

#uključiti

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

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

    assert.h: odgovoran za dijagnostiku programa

    složeni.h: za rad s kompleksnim brojevima

    ctype.h: odgovoran za pretvaranje i provjeru znakova

    errno.h: odgovoran za provjeru grešaka

    fenv.h: za pristup okruženju koje kontrolira operacije s pomičnim zarezom

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

    inttypes.h: za rad s velikim cijelim brojevima

    iso646.h: sadrži niz definicija koje proširuju niz booleovih operacija

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

    locale.h: odgovoran za rad s lokalnom kulturom

    math.h: za rad s matematičkim izrazima

    setjmp.h: Određuje mogućnosti ne-lokalnih skokova

    signal.h: za rukovanje iznimkama

    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 s tipom _Bool

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

    stdint.h: za rad s cijelim brojevima

    stdio.h: za rad s I/O objektima

    stdlib.h: Sadrži definicije i prototipove uobičajenih funkcija

    stdnoreturn.h: sadrži makronaredbu noreturn

    string.h: za rad sa nizovima

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

    niti.h: za rad s nitima

    time.h: za rad s datumima i vremenima

    uchar.h: za rad s Unicode znakovima

    wchar.h: za rad sa simbolima

    wctype.h: sadrži dodatne opcije za rad sa simbolima

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

Osim standardnih datoteka zaglavlja, možemo uključiti i vlastite datoteke. Na primjer, u istoj mapi u kojoj se nalazi glavna programska datoteka definirat ćemo drugu datoteku koju ćemo nazvati main.c. Definirajmo sljedeći kod u njemu:

Int broj = 5;

Definira samo jednu varijablu. Sada uključimo ovu datoteku u program:

#uključiti #include "main.c" int main (void) (printf ("% d", broj); // 5 return 0;)

Prilikom povezivanja njihovih datoteka, njihovo ime je navedeno u navodnicima. I unatoč č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 istoj mapi s glavnim programskim datotekama.

Istodobno, ova metoda izvrsno funkcionira u GCC-u. Ali za različita programska okruženja način povezivanja datoteka može se razlikovati. Na primjer, u Visual Studiju dobit ćemo pogrešku. A ispravniji pristup bio bi definirati deklaraciju objekta (varijable/konstante) ili funkcije u dodatnoj datoteci zaglavlja, a definiciju objekta ili funkcije smjestiti u standardnu ​​datoteku s ekstenzijom .c.

Na primjer, u našoj main.c datoteci već postoji definicija za varijablu broj. Sada dodajte novu datoteku main.h u istu mapu - datoteku s istim imenom, ali s drugim nastavkom. 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:

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

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

Ako se razvoj izvodi u Visual Studio, tada definicija objekta ne mora uključivati ​​izvornu datoteku:

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

Unatoč činjenici da datoteka main.c ovdje nije izričito uključena, ali kada se Visual Studio prevede kroz datoteku zaglavlja main.h moći će povezati datoteku main.c koja se nalazi u istoj mapi.

Vrhunski povezani članci