from example ejemplo c++ c extern-c

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:

  1. Necesitamos usar alguna biblioteca de C en C ++

    extern "C" int foo(int);

  2. Necesitamos exportar algo de código C ++ a C

    extern "C" int foo(int) { something; }

  3. 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")