elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Recopilación Tutoriales y Manuales Hacking, Seguridad, Privacidad, Hardware, etc


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Duda con extern "C"
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Duda con extern "C"  (Leído 3,302 veces)
SARGE553413

Desconectado Desconectado

Mensajes: 176


Ver Perfil
Duda con extern "C"
« 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.


En línea

eferion


Desconectado Desconectado

Mensajes: 1.248


Ver Perfil
Re: Duda con extern "C"
« Respuesta #1 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.


En línea

SARGE553413

Desconectado Desconectado

Mensajes: 176


Ver Perfil
Re: Duda con extern "C"
« Respuesta #2 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.
En línea

eferion


Desconectado Desconectado

Mensajes: 1.248


Ver Perfil
Re: Duda con extern "C"
« Respuesta #3 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
En línea

flony


Desconectado Desconectado

Mensajes: 583



Ver Perfil
Re: Duda con extern "C"
« Respuesta #4 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
y la parte que creo necesitas mas especificamente  es
http://www.zator.com/Cpp/E1_4_2.htm#Planchado de nombres
parte 3.1
En línea

si un problema no tiene solucion entonces no es un problema...es algo inevitable
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines