Razumevanje osnov
Ko gre za priklic funkcij C++ iz C in uporabo objektov C++, je treba upoštevati več ključnih elementov:
Sklicevanje na razrede C++ v C
Pogost pristop k sklicevanju na razrede C++ v C vključuje uporabo kazalcev na razrede, ki se lahko posredujejo med kodo C in C++.
Ime Mangle
Da bi preprečili spremembe imen, ki lahko vplivajo na prepoznavanje v C, je ključnega pomena, da so imena dosledna. To zagotavlja, da lahko C pravilno prepozna in uporabi funkcije in objekte.
Datoteka glave za dvojni namen
Datoteka z glavo ima ključno vlogo in ima dvojni namen za C in C++. Vključuje definicije razredov, ki jih prepozna C++, in zajema funkcije dostopa za C.
Kako poklicati C++ iz C
Za klic funkcij C++ iz C je deklaracija extern »C« ključna. Ko se uporablja za funkcije C++, zagotavlja, da se imena funkcij med postopkom prevajanja obravnavajo v slogu C (z uporabo C-povezave). C ne prepozna funkcij C++, kot sta preobremenitev funkcij in spreminjanje imen, do katerih lahko pride med prevajanjem C++. Z uporabo zunanjega »C« prevajalnik C++ ustvari imena funkcij, ki se držijo konvencij C, kar omogoča brezhibno interoperabilnost. Ta deklaracija zagotavlja standardiziran vmesnik, ki kodi C omogoča dostop do funkcij C++ in njihovo uporabo, ne da bi pri tem naletela na spore pri poimenovanju ali težave z združljivostjo. Sledijo primeri klicanja C++ iz C. Da bi razumeli, kako deluje ta kombinacija, si poglejmo primere podrobneje.
Praktični primeri: Izračunajte ploščino kroga s klicem C++ iz C
V tem preprostem primeru vas bomo vodili, kako lahko izračunate površino kroga s klicem funkcije C++ v C. Ta koda je sestavljena iz datoteke glave (circle.h) in izvedbene datoteke (circle.cpp). Prvi del kode vključuje deklaracijo extern C v datoteki glave. Oglejte si naslednjo kodo. Nato podrobneje razložimo vsako vrstico kode posebej:
#ifndef CIRCLE_AREA#define CIRCLE_AREA
ekstern 'C' {
dvojno izračunaj_CApovršino ( dvojno rad ) ;
}
#endif
dvojno Circle_CAarea ( dvojno rad ) {
vrnitev 3,14159 * rad * rad ;
}
Razčlenimo vsak del:
#ifndef CIRCLE_AREA in #define CIRCLE_AREA
Te vrstice so del varoval za vključitev, ki zagotavljajo, da je vsebina datoteke glave v procesu prevajanja vključena samo enkrat. Če CIRCLE_AREA ni definiran, bo naslednja koda vključena in CIRCLE_AREA bo definiran.
ekstern 'C'Ta sintaksa se uporablja za razglasitev, da ima naslednja funkcija povezavo C. To je bistveno pri pisanju kode, ki bo klicana iz C in C++.
dvojno izračunaj_CApovršino ( dvojno rad ) ;Ta vrstica deklarira funkcijo z imenom 'calculate_Carea', ki sprejme dvojni argument (rad) in vrne dvojni argument.
Extern »C« deklaracija v datoteki glave obvesti prevajalnik, naj za funkcijo uporabi povezavo v slogu C, zaradi česar jo je mogoče priklicati iz kode C. S to kodo poiščite območje kroga tako, da ga shranite v datoteko »circle.h«. Ko shranite to datoteko glave, jo morate samo vključiti kot datoteko glave v program C++ in izvesti želeno funkcijo. Sledi koda C, ki izračuna ploščino kroga. Datoteka »main.c« vključuje glavo C++ in neposredno kliče »Circle_Carea«. Oglejte si naslednjo kodo:
#include 'circle.h'int glavni ( ) {
dvojno rads = 5.0 ;
dvojno območje = Circle_CAarea ( rads ) ;
printf ( 'Površina kroga je: %.2f \n ' , območje ) ;
vrnitev 0 ;
}
Ta preprost program C izračuna in natisne površino kroga z uporabo funkcije, ki je definirana v prejšnji datoteki z imenom 'circle.h'. Razčlenimo kodo:
#include 'circle.h'Ta vrstica vključuje vsebino datoteke glave »circle.h« v programu. Datoteka glave verjetno vsebuje deklaracije funkcij ali makre, ki so povezani z izračuni kroga.
int glavni ( ) {Izvajanje programa se začne z glavno funkcijo, vstopno točko za programe C.
dvojno rads = 5.0 ;Spremenljivka rads tipa double je deklarirana in dodeljena z vrednostjo 5,0. Ta spremenljivka verjetno predstavlja polmer kroga.
dvojno območje = Circle_CAarea ( rads ) ;Funkcija z imenom 'Circle_Carea' se pokliče s polmerom rads kot argumentom in rezultat se shrani v območje spremenljivk.
printf ( 'Površina kroga je: %.2f \n ' , območje ) ;Rezultat se natisne na konzolo z uporabo »printf«. Niz »Območje kroga je: %.2f\n« je formatni niz z ogrado »%f« za vrednost območja. ».2« v »%.2f« določa, da morata biti prikazani samo dve decimalni mesti.
vrnitev 0 ;Glavna funkcija se zaključi z vrnitvijo 0, ki operacijskemu sistemu označuje uspešno izvedbo programa.
Če povzamemo, glava datoteke deklarira funkcijo s povezavo C, implementacijska datoteka pa definira logiko za izračun površine kroga. Ta ločitev omogoča uporabo kode v programih C in C++. Glejte izhod kode, ki je podan na naslednji sliki:
Kot lahko vidite v izhodu, je izračunana površina kroga 78,54, kar je izračun ploščine = 3,14*5*5 = 78,54. Funkcija za izračun površine je definirana v datoteki glave »circle.h«, ki se nato pokliče v datoteki C++ s pomočjo extern »C«.
Zaključek
V tem priročniku smo vas vodili skozi postopek integracije C++ v vaše programe C. Vključevanje funkcionalnosti C++ v kodne baze C zahteva skrbno upoštevanje kazalcev, spreminjanja imen in dvonamenskih datotek glave. Predloženi primeri ponazarjajo praktičen pristop k doseganju te integracije. Zdaj, ko ste videli, kako povezati ta dva programska jezika, imate več orodij. Odklepanje moči C++ med delom s C bi lahko vašim projektom dalo povsem novo raven funkcionalnosti.