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++?
2 réponses
extern "C" permet de noms, pas de déformation.
utilisé quand:
-
nous avons besoin d'utiliser une bibliothèque C en C++
extern "C" int foo(int);
-
nous avons besoin d'exporter du code C++ vers c
extern "C" int foo(int) { something; }
-
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")
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.