Quand utiliser extern " C " en C++? [dupliquer]

possible Duplicate:

Pourquoi avons-nous besoin d'un "C" externe{ #include } en C++?

j'ai souvent vu des programmes codés comme:

extern "C" bool doSomeWork() {
  //
  return true;
}

Pourquoi utiliser un bloc extern "C" ? Peut-on le remplacer par quelque chose en C++? Y a-t-il un avantage à utiliser extern "C" ?

je vois un lien expliquant ce mais pourquoi avons-nous besoin de compiler quelque chose en C alors que nous avons déjà C++?

22
demandé sur 8 revs, 3 users 50%unknown 2009-08-18 10:30:14

2 réponses

extern "C" permet de noms, pas de déformation.

utilisé quand:

  1. nous avons besoin d'utiliser une bibliothèque C en C++

    extern "C" int foo(int);
    
  2. nous avons besoin d'exporter du code C++ vers c

    extern "C" int foo(int) { something; }
    
  3. nous avons besoin d'une capacité à résoudre le symbole dans la bibliothèque partagée -- donc nous avons besoin de se débarrasser de la mutilation

    extern "C" int foo(int) { something; }
    ///
    typedef int (*foo_type)(int);
    foo_type f = (foo_type)dlsym(handle,"foo")
    
31
répondu Artyom 2009-08-18 06:35:30

un endroit où" c " externe a du sens est quand vous liez à une bibliothèque qui a été compilée comme code C.

extern "C" {
  #include "c_only_header.h"
}

sinon, vous pourriez avoir des erreurs de linker parce que la bibliothèque contient les fonctions avec C-linkage (_myfunc) mais le compilateur C++, qui a traité l'en - tête de la bibliothèque comme du code C++, a généré des noms de symboles C++ pour les fonctions ("_myfunc@XAZZYE" - c'est appelé mangling et différent pour chaque compilateur).

un autre l'endroit où " c " externe est utilisé est pour garantir la liaison C même pour les fonctions écrites en C++, par exemple.

extern "C" void __stdcall PrintHello() {
  cout << "Hello World" << endl;
}

une telle fonction peut être exportée vers une DLL et sera alors appelable à partir d'un autre langage de programmation parce que la compilation ne va pas nuire à son nom. Si vous avez ajouté une autre surcharge de la même fonction, par exemple.

extern "C" void __stdcall PrintHello() {
  cout << "Hello World" << endl;
}
extern "C" void __stdcall PrintHello(const char *name) {
  cout << "Hello, " << name << endl;
}

la plupart des compilateurs attraperaient alors cela et donc vous empêcher d'utiliser des surcharges de fonction dans votre DLL-fonctions publiques.

13
répondu Cygon 2009-08-18 06:42:20