Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: SARGE553413 en 2 Febrero 2015, 11:20 am



Título: Duda con extern "C"
Publicado por: SARGE553413 en 2 Febrero 2015, 11:20 am
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.


Título: Re: Duda con extern "C"
Publicado por: eferion en 2 Febrero 2015, 12:20 pm
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.


Título: Re: Duda con extern "C"
Publicado por: SARGE553413 en 3 Febrero 2015, 12:53 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.


Título: Re: Duda con extern "C"
Publicado por: eferion en 3 Febrero 2015, 13:08 pm
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


Título: Re: Duda con extern "C"
Publicado por: flony en 9 Febrero 2015, 15:41 pm
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
Citar
En 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 (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 (http://www.zator.com/Cpp/E1_4_2.htm#Planchado de nombres)
parte 3.1