2009-08-18 12 views
20

Duplicar posible:
Why do we need extern “C”{ #include <foo.h> } in C++?Cuándo usar extern "C" en C++?

menudo he visto programas codificados como:

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

¿Por qué utilizamos un bloque de extern "C"? ¿Podemos reemplazar esto con algo en C++? ¿Hay alguna ventaja al usar extern "C"?

Veo un enlace que explica this, pero ¿por qué tenemos que compilar algo en C cuando ya tenemos C++?

+3

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

+0

relacionado: 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-in-c / –

Respuesta

29

extern "C" hace nombres no destrozados.

Se utiliza cuando:

  1. tenemos que utilizar alguna biblioteca C en C++

    extern "C" int foo(int); 
    
  2. Necesitamos exportar algunos código C++ a C

    extern "C" int foo(int) { something; } 
    
  3. Necesitamos una habilidad para resolver símbolos en la biblioteca compartida, así que tenemos que deshacernos de la destrucción

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

Un lugar donde extern "C" tiene sentido es cuando se va a asociar a una biblioteca que fue compilado como código C.

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

De lo contrario, podría obtener errores de enlace debido a que la biblioteca contiene las funciones con C-vinculación (_myfunc), pero el compilador de C++, que procesa la cabecera de la biblioteca como código C++, generado C++ nombres de símbolos para las funciones (" _myfunc @ XAZZYE "- esto se denomina manipulación y diferente para cada compilador).

Otro lugar donde se usa el extern "C" es para garantizar la vinculación C incluso para las funciones escritas en C++, por ejemplo.

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

Tal función se puede exportar a un archivo DLL y será entonces puede llamar desde otro lenguaje de programación debido a que la compilación no va a destrozar su nombre. Si agregó otra sobrecarga de la misma función, p. Ej.

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

La mayoría de los compiladores lo detectarían y, por lo tanto, evitarían el uso de sobrecargas de función en las funciones de DLL-público.