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); }