Maison >développement back-end >C++ >Comment puis-je appeler des fonctions C à partir du code C et éviter les problèmes de modification des noms ?

Comment puis-je appeler des fonctions C à partir du code C et éviter les problèmes de modification des noms ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-12-25 01:58:13871parcourir

How Can I Call C   Functions from C Code and Avoid Name Mangling Issues?

Appel de fonctions C à partir de C : navigation dans la manipulation de noms

Lorsque vous travaillez avec des applications multilangages, le défi d'appeler des fonctions C depuis C survient en raison de la mutilation du nom de C. Contrairement au C, qui utilise des noms de fonctions simples, le C utilise un schéma de dénomination complexe pour résoudre les fonctions et les classes surchargées, ce qui entraîne des signatures de fonctions différentes. Cela peut entraîner des erreurs de l'éditeur de liens lors de la tentative de résolution de symboles non résolus.

Dans de tels cas, une solution de contournement consiste à créer une API C qui donne accès à la fonctionnalité C. Cela implique d'écrire du code C déclaré comme extern "C" et d'adhérer à une syntaxe C pure, en évitant les fonctionnalités orientées objet comme les classes. Par la suite, une bibliothèque wrapper C est créée pour exposer les fonctionnalités de la bibliothèque C.

Par exemple, considérons l'API C suivante :

#ifdef __cplusplus
#define EXTERNC extern "C"
#else
#define EXTERNC
#endif

typedef void* mylibrary_mytype_t;

EXTERNC mylibrary_mytype_t mylibrary_mytype_init();
EXTERNC void mylibrary_mytype_destroy(mylibrary_mytype_t mytype);
EXTERNC void mylibrary_mytype_doit(mylibrary_mytype_t self, int param);

#undef EXTERNC

L'implémentation C correspondante serait la suivante :

mylibrary_mytype_t mylibrary_mytype_init() {
  return new MyType;
}

void mylibrary_mytype_destroy(mylibrary_mytype_t untyped_ptr) {
   MyType* typed_ptr = static_cast<MyType*>(untyped_ptr);
   delete typed_ptr;
}

void mylibrary_mytype_doit(mylibrary_mytype_t untyped_self, int param) {
   MyType* typed_self = static_cast<MyType*>(untyped_self);
   typed_self->doIt(param);
}

Cette approche vous permet d'accéder aux fonctionnalités C à partir du code C tout en atténuant les problèmes de modification des noms.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn