2009-08-18 14 views
20

Possible en double:
Why do we need extern “C”{ #include <foo.h> } in C++?Quand utiliser extern "C" en C++?

je l'ai souvent vu des programmes codés comme:

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

Pourquoi utiliser un bloc extern "C"? Pouvons-nous remplacer cela par quelque chose en C++? Y at-il un avantage à utiliser extern "C"?

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

+3

Duplication de http://stackoverflow.com/questions/67894/why-do-we-need-extern-c-include-foo-h-in-c – Aamir

+0

en relation: http://stackoverflow.com/questions/1041866/extern-c http://stackoverflow.com/questions/717729/does-extern-c-have-any-effect-in-c http://stackoverflow.com/questions/496448/how-to-correctly -use-the-extern-keword-en-c / –

Répondre

29

extern "C" rend les noms non altérés.

Il utilisé lorsque:

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

    extern "C" int foo(int); 
    
  2. Nous avons besoin d'exporter une partie du code C++ à C

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

    extern "C" int foo(int) { something; } 
    /// 
    typedef int (*foo_type)(int); 
    foo_type f = (foo_type)dlsym(handle,"foo") 
    
10

Un endroit où extern « C » est logique lorsque vous liez à une bibliothèque qui a été compilé sous forme de code C.

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

Sinon, vous risquez d'obtenir des erreurs de l'éditeur de liens, car la bibliothèque contient les fonctions avec C-liaison (_myfunc) mais le compilateur C++, qui a traité l'en-tête de la bibliothèque sous forme de code C++, généré noms C++ symbole pour les fonctions (» _myfunc @ XAZZYE "- ceci est appelé mangling et différent pour chaque compilateur).

Un autre endroit où extern "C" est utilisé est de garantir la liaison C même pour les fonctions écrites en C++, par exemple.

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

Cette fonction peut être exportée vers une DLL et sera alors rachetable d'autres langages de programmation parce que la compilation ne sera pas mutiler 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 l'attraperaient alors et vous empêcheraient ainsi d'utiliser des surcharges de fonctions dans vos fonctions publiques DLL.