Jsou chvíle, kdy je nutné smíchat kód C a C++ dohromady. Například při používání staršího kódu C nebo při používání konkrétní knihovny C poskytuje vašemu kódu C++ některé specifické funkce. Při používání kódu C v souboru C++ nebo naopak je tedy třeba věnovat pozornost některým speciálním krokům.
Tento článek prostřednictvím několika příkladů popisuje kroky potřebné ke smíchání kódu C/C++.
1. Volání funkcí C z C++
V této části probereme, jak volat funkce C z kódu C++.
Zde je kód C (Cfile.c):
#include <stdio.h> void f(void) { printf("\n This is a C code\n"); }
Prvním krokem je vytvoření knihovny tohoto C kódu. Následující kroky vytvoří sdílenou knihovnu:
$ gcc -c -Wall -Werror -fPIC Cfile.c $ gcc -shared -o libCfile.so Cfile.o
Sdílená knihovna libCfile.so je vytvořena jako výsledek dvou výše uvedených příkazů.
Zde je hlavní kód C++ (main.cpp):
#include <iostream> extern "C" { void f(); } void func(void) { std::cout<<"\n being used within C++ code\n"; } int main(void) { f(); func(); return 0; }
C funkce f() je deklarována v notaci extern “C”, aby sdělila kompilátoru cpp, že má vazbu typu C.
Nyní zkompilujte kód (ujistěte se, že sdílená knihovna libCfile.so je propojena s kódem):
$ g++ -L/home/himanshu/practice/ -Wall main.cpp -o main -lCfile
Před spuštěním spustitelného souboru se ujistěte, že cesta ke sdílené knihovně je obsažena v proměnné prostředí LD_LIBRARY_PATH.
$ export LD_LIBRARY_PATH=/home/himanshu/practice:$LD_LIBRARY_PATH
Nyní spusťte spustitelný soubor ‚main‘ :
$ ./main This is a C code being used within C++ code
Vidíme tedy, že funkce C byla úspěšně volána z kódu C++.
Přečtěte si také podrobné informace o tom, jak vytvořit sdílené knihovny v Linuxu.
2. Volejte funkce C++ z C
V této části probereme, jak volat funkce C++ z kódu C.
Zde je kód C++ (CPPfile.cpp):
#include <iostream> void func(void) { std::cout<<"\n This is a C++ code\n"; }
Uvidíme, jak lze funkci func() volat z kódu C.
Prvním krokem k tomu je změnit deklaraci/definici této funkce zavedením externí notace „C“.
#include <iostream> extern "C" void func(void) { std::cout<<"\n This is a C++ code\n"; }
Dalším krokem je vytvoření knihovny z výše uvedeného kódu. Následující kroky vytvoří sdílenou knihovnu:
g++ -c -Wall -Werror -fPIC CPPfile.cpp $ g++ -shared -o libCPPfile.so CPPfile.o
Výše uvedené příkazy by měly vést ke sdílené knihovně libCPPfile.so.
Zde je hlavní kód v jazyce C (main.c):
#include <stdio.h> extern void func(void); void f(void) { printf("\n being used within C code\n"); } int main(void) { func(); f(); return 0; }
Upozorňujeme, že funkce C++ je zde deklarována jako externí.
Zkompilujte kód C (main.c) takto:
gcc -L/home/himanshu/practice/ -Wall main.c -o main -lCPPfile
a přidejte aktuální cestu k adresáři do proměnné prostředí LD_LIBRARY _PATH
export LD_LIBRARY_PATH=/home/himanshu/practice:$LD_LIBRARY_PATH
Nyní spusťte spustitelný soubor ‚main‘ :
$ ./main This is a C++ code being used within C code
Výše uvedený výstup ukazuje, že funkce C++ byla úspěšně volána z kódu C.