Razumijevanje osnova
Kada se radi o pozivanju C++ funkcija iz C-a i korištenju C++ objekata, potrebno je razmotriti nekoliko ključnih elemenata:
Referenciranje C++ klasa u C-u
Uobičajeni pristup referenciranju C++ klasa u C-u uključuje korištenje pokazivača na klase koji se mogu proslijediti između C i C++ koda.
Ime Mangle
Kako biste spriječili promjene imena koje mogu utjecati na prepoznavanje u C-u, ključno je da imena budu dosljedna. Ovo osigurava da C može ispravno identificirati i koristiti funkcije i objekte.
Datoteka zaglavlja za dvostruku namjenu
Datoteka zaglavlja ima ključnu ulogu, služeći dvostrukoj svrsi i za C i za C++. Uključuje definicije klasa koje su prepoznatljive u C++ i enkapsulira pristupne funkcije za C.
Kako pozvati C++ iz C-a
Za pozivanje C++ funkcija iz C-a ključna je extern “C” deklaracija. Kada se primijeni na C++ funkcije, osigurava da se nazivi funkcija tretiraju u C stilu (koristeći C-linkage) tijekom procesa kompilacije. C ne prepoznaje C++ značajke kao što su preopterećenje funkcija i krivotvorenje naziva do kojih može doći tijekom C++ kompilacije. Koristeći extern “C”, C++ prevodilac generira nazive funkcija koji se pridržavaju C konvencija, omogućujući besprijekornu interoperabilnost. Ova deklaracija pruža standardizirano sučelje, omogućujući C kodu pristup i korištenje C++ funkcija bez susretanja sa sukobima naziva ili problemima kompatibilnosti. Slijede primjeri pozivanja C++ iz C-a. Da bismo razumjeli kako ova kombinacija funkcionira, pogledajmo pobliže instance.
Praktični primjeri: Izračunajte površinu kruga pozivanjem C++ iz C-a
U ovom jednostavnom primjeru uputit ćemo vas kako možete izračunati površinu kruga pozivanjem C++ funkcije u C-u. Ovaj se kod sastoji od datoteke zaglavlja (circle.h) i implementacijske datoteke (circle.cpp). Prvi dio koda uključuje extern C deklaraciju u datoteci zaglavlja. Pogledajte sljedeći kod. Zatim, razradimo svaku liniju koda pojedinačno:
#ifndef PODRUČJE_KRUGA#definiraj CIRCLE_AREA
vanjski 'C' {
dvostruko izračunaj_CApovršinu ( dvostruko rad ) ;
}
#završi ako
dvostruko Područje_kruga ( dvostruko rad ) {
povratak 3.14159 * rad * rad ;
}
Razdvojimo svaki dio:
#ifndef CIRCLE_AREA i #define CIRCLE_AREA
Ovi redovi su dio uključenih čuvara koji osiguravaju da je sadržaj datoteke zaglavlja uključen samo jednom u procesu kompilacije. Ako CIRCLE_AREA nije definiran, sljedeći kod će biti uključen i CIRCLE_AREA će biti definiran.
vanjski 'C'Ova se sintaksa koristi za deklaraciju da sljedeća funkcija ima C vezu. Ovo je bitno kada pišete kod koji će se pozivati i iz C i iz C++.
dvostruko izračunaj_CApovršinu ( dvostruko rad ) ;Ovaj redak deklarira funkciju pod nazivom 'calculate_Carea' koja uzima dvostruki argument (rad) i vraća dvostruki argument.
Extern “C” deklaracija u datoteci zaglavlja obavještava kompajler da koristi vezu u stilu C za funkciju, čineći je pozivnom iz C koda. Upotrijebite ovaj kod da biste pronašli površinu kruga tako da ga spremite u datoteku 'circle.h'. Nakon što spremite ovu datoteku zaglavlja, sve što trebate učiniti je uključiti je kao datoteku zaglavlja u C++ program i izvesti željenu funkciju. Slijedi C kod koji izračunava površinu kruga. Datoteka 'main.c' uključuje C++ zaglavlje i izravno poziva 'Circle_Carea'. Pogledajte sljedeći kôd:
#uključi 'krug.h'int glavni ( ) {
dvostruko rads = 5.0 ;
dvostruko područje = Područje_kruga ( rads ) ;
printf ( 'Površina kruga je: %.2f \n ' , područje ) ;
povratak 0 ;
}
Ovaj jednostavni C program izračunava i ispisuje površinu kruga pomoću funkcije koja je definirana u prethodnoj datoteci pod nazivom 'circle.h'. Razdvojimo kôd:
#uključi 'krug.h'Ovaj redak uključuje sadržaj datoteke zaglavlja 'circle.h' u programu. Datoteka zaglavlja vjerojatno sadrži deklaracije funkcija ili makronaredbe koje se odnose na kružne izračune.
int glavni ( ) {Izvršenje programa počinje s glavnom funkcijom, ulaznom točkom za C programe.
dvostruko rads = 5.0 ;Varijabla rads tipa double je deklarirana i dodijeljena joj je vrijednost 5.0. Ova varijabla vjerojatno predstavlja radijus kruga.
dvostruko područje = Područje_kruga ( rads ) ;Funkcija pod nazivom 'Circle_Carea' poziva se s radijusom radijusa kao argumentom, a rezultat se pohranjuje u područje varijable.
printf ( „Površina kruga je: %.2f \n ' , područje ) ;Rezultat se ispisuje na konzolu koristeći 'printf'. Niz 'Područje kruga je: %.2f\n' je niz oblikovanja s rezerviranim mjestom '%f' za vrijednost površine. “.2” u “%.2f” navodi da se trebaju prikazati samo dva decimalna mjesta.
povratak 0 ;Glavna funkcija završava vraćanjem 0 što ukazuje na uspješno izvršenje programa operativnom sustavu.
Ukratko, datoteka zaglavlja deklarira funkciju s C vezom, a datoteka implementacije definira logiku za izračunavanje površine kruga. Ovo odvajanje omogućuje korištenje koda u C i C++ programima. Pogledajte izlaz koda koji je dan na sljedećoj slici:
Kao što možete vidjeti u izlazu, izračunata površina kruga je 78,54 što je izračun površine = 3,14*5*5 = 78,54. Funkcija za izračunavanje površine definirana je u datoteci zaglavlja 'circle.h' koja se zatim poziva u C++ datoteci uz pomoć extern 'C'.
Zaključak
Vodili smo vas kroz proces integracije C++ u vaše C programe u ovom vodiču. Integracija C++ funkcionalnosti u C kodne baze zahtijeva pažljivo razmatranje pokazivača, iskrivljenih naziva i datoteka zaglavlja dvostruke namjene. Navedeni primjeri ilustriraju praktičan pristup postizanju te integracije. Sada kada ste vidjeli kako povezati ova dva programska jezika, imate više alata. Otključavanje snage C++-a tijekom rada s C-om moglo bi vašim projektima dati potpuno novu razinu funkcionalnosti.