106 votes

Comment appeler une fonction C++ à partir de C ?

Je le sais.

Appel d'une fonction C à partir de C++ :

Si mon application était en C++ et que je devais appeler des fonctions d'une bibliothèque écrite en C, j'aurais utilisé

//main.cpp

extern "C" void C_library_function(int x, int y);//prototype
C_library_function(2,4);// directly using it.

Cela ne dénaturerait pas le nom C_library_function et l'éditeur de liens trouverait le même nom dans ses fichiers *.lib en entrée et le problème serait résolu.

Appeler une fonction C++ à partir du C ???

Mais ici, je développe une grande application écrite en C et j'ai besoin d'utiliser une bibliothèque écrite en C++. La manipulation des noms en C++ pose problème ici. L'éditeur de liens se plaint des symboles non résolus. Je ne peux pas utiliser le compilateur C++ sur mon projet C parce que cela casse beaucoup d'autres choses. Quelle est la solution ?

Par ailleurs, j'utilise MSVC

0voto

Richard Wicks Points 1
#include <iostream>

//////////////
// C++ code //
//////////////
struct A
{
  int i;
  int j;

  A() {i=1; j=2; std::cout << "class A created\n";}
  void dump() {std::cout << "class A dumped: " << i << ":" << j << std::endl;}
  ~A() {std::cout << "class A destroyed\n";}
};

extern "C" {
  // this is the C code interface to the class A
  static void *createA (void)
  {
    // create a handle to the A class
    return (void *)(new A);
  }
  static void dumpA (void *thisPtr)
  {
    // call A->dump ()
    if (thisPtr != NULL) // I'm an anal retentive programmer
    {
      A *classPtr = static_cast<A *>(thisPtr);
      classPtr->dump ();
    }
  }
  static void *deleteA (void *thisPtr)
  {
    // destroy the A class
    if (thisPtr != NULL)
    {
      delete (static_cast<A *>(thisPtr));
    }
  }
}

////////////////////////////////////
// this can be compiled as C code //
////////////////////////////////////
int main (int argc, char **argv)
{
  void *handle = createA();

  dumpA (handle);
  deleteA (handle);

  return 0;
}

-4voto

Vous pouvez faire précéder la déclaration de la fonction du mot-clé extern "C", par exemple

extern "C" int Mycppfunction()

{

// Le code va ici

retour 0 ;

}

Pour plus d'exemples, vous pouvez faire une recherche sur Google avec le mot-clé "extern". Vous devez faire un peu plus de choses, mais ce n'est pas difficile, vous trouverez beaucoup d'exemples sur Google.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X