c++ - example - extern function c
¿Cuándo usar extern "C" en C++? (2)
Un lugar donde extern "C" tiene sentido es cuando se está vinculando a una biblioteca compilada como código C.
extern "C" {
#include "c_only_header.h"
}
De lo contrario, podría obtener errores de vinculador porque la biblioteca contiene las funciones con enlace C (_myfunc) pero el compilador de C ++, que procesó el encabezado de la biblioteca como código C ++, generó nombres de símbolos de C ++ para las funciones ("_myfunc @ XAZZYE" - esto es Llamado mangling y diferente para cada compilador).
Otro lugar donde se usa extern "C" es garantizar el enlace de C incluso para las funciones escritas en C ++, por ejemplo.
extern "C" void __stdcall PrintHello() {
cout << "Hello World" << endl;
}
Dicha función se puede exportar a una DLL y luego se podrá llamar desde otro lenguaje de programación porque la compilación no modificará su nombre. Si agregó 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 captarían esto y, por lo tanto, evitarían el uso de sobrecargas de funciones en sus funciones públicas de DLL.
Posible duplicado:
¿Por qué necesitamos extern "C" {#include <foo.h>} en C ++?
A menudo he visto programas codificados como:
extern "C" bool doSomeWork() {
//
return true;
}
¿Por qué usamos un bloque extern "C"
? ¿Podemos reemplazar esto con algo en C ++? ¿Hay alguna ventaja de usar extern "C"
?
Veo un enlace que explica this pero ¿por qué necesitamos compilar algo en C cuando ya tenemos C ++?
extern "C" hace nombres no destrozados.
Se utiliza cuando:
Necesitamos usar alguna biblioteca de C en C ++
extern "C" int foo(int);
Necesitamos exportar algo de código C ++ a C
extern "C" int foo(int) { something; }
Necesitamos la capacidad de resolver el símbolo en una biblioteca compartida, por lo que necesitamos deshacernos de la mutilación
extern "C" int foo(int) { something; } /// typedef int (*foo_type)(int); foo_type f = (foo_type)dlsym(handle,"foo")