Le langage C appelle la bibliothèque de programmes C++, exemple de description

Parfois, il est nécessaire d'appeler la bibliothèque C++ sous le programme C. Après avoir lu beaucoup d'articles, soit les mots sont trop profonds et redondants pour être compris d'un coup, soit les exemples sont trop simples à comprendre ou à ne pas utiliser, alors ce blog prend Un compromis entre les deux, en donnant des explications simples et faciles à comprendre, et en donnant des exemples.

Tout d'abord, les noms de fonction générés après la compilation d'une fonction en C et C++ sont différents, donc les deux ne peuvent pas être utilisés en commun, même si C++ est utilisé pour appeler la bibliothèque dynamique compilée par le programme C, ce n'est pas autorisé, et vice versa. Alors, comment C appelle-t-il C++ ? interface.cppLa réponse est d'écrire un programme d'interface.Le fichier de ce programme d'interface est chargé d'encapsuler les fonctions spécifiques de la bibliothèque C++ dans les fonctions C, et le fichier d'en-tête interface.hest appelé par la fonction principale. Il est plus facile de voir un exemple, jetons un coup d'œil.

Supposons d'abord qu'il existe un programme C++ test.cppettest.hpp

// test.hpp 文件内容:定义了ClassA类
class ClassA{
   public:
      void func(int a);
};
// test.cpp 文件内容:实现了ClassA::func(int a)函数
#include <iostream>
#include "test.hpp"
using namespace std;

void ClassA::func(int a){
   cout<<"class A: "<<a<<endl;
}

En supposant qu'il s'agit d'un programme C++ que nous avons déjà, comment main.cl'appeler dans un programme C ? La réponse est d'écrire une interface interface.

// interface.h文件内容
#ifdef __cplusplus
extern "C"{
#endif

void func(int a);

#ifdef __cplusplus
}
#endif
// interface.cpp 文件内容
#include "test.hpp"
#include "interface.h"
void func(int a){
   ClassA c;
   c.func(a);
}

Ce qui précède est le pont reliant la bibliothèque C++ et le programme C. La partie interface.hci -jointe signifie compiler le programme C. L'instruction est activée lorsqu'une macro est définie , et cette macro est automatiquement compilée lorsque g++ est utilisé. Si elle est compilée en langage C, la macro ne sera pas définie , et naturellement elle ne sera pas activée (le langage C ne la reconnaît pas , il faut donc la basculer avec une macro). Dans le programme, la fonction C++ est encapsulée en tant que fonction de style C pour appeler dans main.extern "C"{}extern "C"{}__cplusplus__cplusplusextern "C"{}extern "C"{}Interface.cpptest.cpp

Ici, vous pouvez remarquer que Interfacele fichier d'implémentation est .cpp, et le fichier d'en-tête est .h, qui est utilisé par les programmes C pour .cpplier la bibliothèque C++ .h. C'est vraiment déroutant après avoir lu ceci, vous pouvez vous faire une idée générale pour le moment, et quand nous parlerons de la fonction principale, nous reviendrons en arrière et la comprendrons. À ce stade, la bibliothèque C++ et l'interface peuvent être compilées conjointement dans libtest.soune bibliothèque dynamique

g++ test.cpp interface.cpp -shared -fPIC -o libtest.so

Enfin arrivé à la fonction principale, comme suit

// main.c 文件内容
#include "interface.h"
int main()
{
   func(1);
}

Maintenant, nous devons compiler la fonction principale comme suit :

gcc main.c ./libtest.so -o main

Autrement dit, le programme en langage C appelle la bibliothèque de programmes C++. Résumons maintenant, il s'agit d'écrire une interface de package, le fichier cpp d'implémentation spécifique de l'interface est utilisé pour empaqueter la bibliothèque C++ dans une interface lisible du programme C, et le fichier d'en-tête .h de l'interface est utilisé pour être appelé par le programme C. Ensuite, les lecteurs se demanderont pourquoi il n'est pas nécessaire d'ajouter le commutateur de contrôle de définition de macro dans interface.h . En effet, interface.h est appelé par et en même temps .Le premier doit être compilé en mode C++, et le second doit être compilé en mode C, ce qui nécessite un commutateur__cplusplusextern "C"interface.cppmain.c .

extern "C"Ne cherchez pas d'autres tutos, ce blog est l'article que vous trouverez le plus susceptible de vous aider à comprendre , après l'avoir lu plusieurs fois et mis en oeuvre à la main, vous comprendrez.


Remarques :
1. La différence entre gcc et g++ n'est pas que le premier est utilisé pour compiler des programmes c, tandis que le second est utilisé pour compiler des programmes c++.Pour les programmes simples, .cppgcc peut également être utilisé pour les compiler. Le noyau de g++ est toujours gcc, mais certaines définitions de macros et bibliothèques sont ajoutées par défaut. En bref, gcc ne peut pas être simplement considéré comme utilisé pour compiler des programmes c, et g++ est utilisé pour compiler des programmes c++. Les lecteurs intéressés peuvent se référer à des informations plus détaillées.

Je suppose que tu aimes

Origine blog.csdn.net/Meiyuan2021/article/details/129864332
conseillé
Classement