Duda con extern "C"

Iniciado por SARGE553413, 2 Febrero 2015, 11:20 AM

0 Miembros y 1 Visitante están viendo este tema.

SARGE553413

Hola a todos.

Tengo una duda respecto a extern "C", entiendo lo que hace y como funciona, es para forzar el linkado de C aun cuando se intenta compilar en c++.

Mi pregunta es exactamente para qué o en qué situaciones se requiere hacer esto. La única utilidad que le veo es  que los nombres no estén "mangled" a la hora de crear y usar un dll con dichas funciones.

¿Alguien me puede explicar en qué situaciones se debe usar, y por qué/qué problema evita?

Saludos, gracias.

eferion

C++ soporta la sobrecarga de funciones, mientras que C no. Para poder admitir esta sobrecarga, C++ dispone de un mecanismo de nombrado de funciones diferente al utilizado por C. Ambos mecanismos son incompatibles.

"extern C" obliga al compilador de C++ a generar nombres a la usanza de C, lo que te permite linkar ese código objeto con un compilador de C.

Si siempre vas a generar el código usando un compilador C++ y no vas a reutilizar código precompilado en C++ para generar librerías y/o aplicaciones con un compilador de C puedes ahorrarte el uso de "extern C".

Un saludo.

SARGE553413

Cita de: eferion en  2 Febrero 2015, 12:20 PM
"extern C" obliga al compilador de C++ a generar nombres a la usanza de C, lo que te permite linkar ese código objeto con un compilador de C.

Si siempre vas a generar el código usando un compilador C++ y no vas a reutilizar código precompilado en C++ para generar librerías y/o aplicaciones con un compilador de C puedes ahorrarte el uso de "extern C".

Gracias.

Ok, entonces el uso principal de extern "C" es generar código objeto en C++ que pueda ser utilizado desde C ¿correcto?

¿Por código objeto estamos hablando de código compilado (como .dll, .lib en windows y .o, .so, en linux)?

Saludos.

eferion

código objeto es código precompilado... como sabes la compilación en C y C++ se realiza en dos pasos... primero se genera código objeto y después ese código objeto se transforma en código binario ejecutable

flony

yo tenia entendido que era para evitar que el "planchado" en la parte de compilacion
como no soy bueno para explicar pongo info al respecto
CitarEn L.1 extern es un especificador de tipo de almacenamiento y su uso es redundante, pues hemos visto   que se supone por defecto en todos los prototipos de funciones.

En L.2 extern "C" es una directiva de enlazado que indica al "linker" que utilice esta convención para el enlazado de la función.  Por ejemplo, porque no se desea que los identificadores sean "planchados" ( 1.4.2).

La diretiva extern "C" puede también aplicarse a bloques completos (bloque de enlazado):
fuente
http://www.zator.com/Cpp/E1_4_4.htm#extern
y la parte que creo necesitas mas especificamente  es
http://www.zator.com/Cpp/E1_4_2.htm#Planchado de nombres
parte 3.1
si un problema no tiene solucion entonces no es un problema...es algo inevitable