Liaison C et C ++ avec extern “C”

J’ai une fonction C ++ définie dans un fichier .h comme suit et implémentée dans un fichier .cpp:

extern "C" void func(bool first, float min, float* state[6], float* err[6][6]) { //uses vectors and classes and other C++ constructs } 

Comment appeler func dans un fichier C? Comment puis-je configurer mon architecture de fichier / makefile pour comstackr cela?

Merci!

Pour l’appeler en C, il suffit de l’appeler normalement. Parce que vous avez dit au compilateur d’utiliser les conventions d’appel C et ABI avec extern "C" , vous pouvez l’appeler normalement:

 func(args); 

Pour comstackr, utilisez ceci pour le C ++:

 g++ -c -o myfunc.o myfunc.cpp 

Alors ceci pour le C:

 gcc -c -o main.o somec.c 

Que lien:

 g++ -o main main.o myfunc.o 

Assurez-vous que l’en-tête C ++ de la fonction utilise UNIQUEMENT C CONSTRUCTS . Vous devez donc inclure des éléments tels que dans le fichier .cpp .

Vous appelez la fonction de C de la manière habituelle. Cependant, vous devez envelopper le extern "C" dans une macro de préprocesseur pour empêcher le compilateur C de le voir:

 #ifndef __cplusplus extern "C" #endif void func(bool first, float min, float* state[6], float* err[6][6]); 

En supposant que vous travaillez avec GCC, comstackz le code C avec gcc , comstackz le code C ++ avec g++ , puis établissez un lien avec g++ .

appeler en C en utilisant

 func(... // put arguments here); 

En disant extern “C”, vous demandez au compilateur de ne pas modifier vos noms. Sinon, le compilateur C ++ aurait tendance à les modifier (c’est-à-dire à append des symboles supplémentaires pour les rendre uniques) avant l’éditeur de liens.

Vous voudrez également vous assurer que vous êtes configuré pour utiliser la convention d’appel en C.

 //header file included from both C and C++ files #ifndef __cplusplus #include  // for C99 type bool #endif #ifdef __cplusplus extern "C" { #endif void func(bool first, float min, float* state[6], float* err[6][6]); #ifdef __cplusplus } // extern "C" #endif 

 // cpp file #include "the_above_header.h" #include  extern "C" void func(bool first, float min, float* state[6], float* err[6][6]); { //uses vectors and classes and other C++ constructs } // c file #include "the_above_header.h" int main() { bool b; float f; float *s[6]; float *err[6][6]; func(b,f,s,err); }