Pregunta

  

Duplicar posible:
   ¿Por qué necesitamos extern “C” {# incluir } en C ++?

He programas codificados, como se ve a menudo:

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

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

Veo un enlace que explica este pero ¿por qué necesitamos para compilar algo en C cuando ya tenemos C ++?

¿Fue útil?

Solución

extern "C" hace que los nombres no destrozados.

Se utiliza cuando:

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

    extern "C" int foo(int);
    
  2. Tenemos que exportar algo de código C ++ a C

    extern "C" int foo(int) { something; }
    
  3. Necesitamos una capacidad para resolver símbolo en la biblioteca compartida - por lo que necesita para deshacerse mangling

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

Otros consejos

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 llama mangling y diferente para cada compilador)

Otro lugar donde se utiliza extern "C" es garantizar C vinculación incluso para 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 ha añadido otra sobrecarga de la misma función, por ejemplo.

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 luego coger esto y por lo tanto evitar que utilice sobrecargas de función en sus funciones DLL-público.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top