Cuándo utilizar extern “C” en C ++? [duplicar]
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 ++?
Solución
extern "C" hace que los nombres no destrozados.
Se utiliza cuando:
-
Tenemos que utilizar alguna biblioteca C en C ++
extern "C" int foo(int);
-
Tenemos que exportar algo de código C ++ a C
extern "C" int foo(int) { something; }
-
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.