2011-06-30 13 views
5

Tengo que convertir algunos códigos C/C++ a Java. Mi C++ está extremadamente oxidado.Pregunta de conversión C++ a Java sobre extern "C"

En un archivo de .h, tengo los siguientes:

#ifdef __cplusplus 
extern "C" { 
#endif 

/* tons of declarations */ 

#ifdef __cplusplus 
} /* extern C */ 
#endif 

¿Cuál es el uso de extern "C"? Qué significa eso? ¿Le está diciendo al compilador que el código correspondiente debe interpretarse como C puro, en lugar de C++?

EDITAR

Gracias por las respuestas hasta ahora. La historia del código que tengo que convertir es que parece que una parte se escribió en C primero, luego el resto se escribió en C++. Entonces mi archivo de encabezado parece corresponderse con el 'antiguo' código C.

Convertiré este código en un public final class con métodos y atributos estáticos. Sin anulación.

Respuesta

4

Está diciendo al compilador que las firmas de función deben ser C compatibles. El cambio de nombre de nombre es diferente en C y C++ (es decir, C++ admite sobrecarga de método mientras que C no) así que para hacer algunas llamadas a función (es decir, algunas llamadas dinámicas de DLL) compatibles con C, usa extern C en código C++.

Take a look at this StackOverflow question for a great explanation on the topic.

+1

es decir, C no destruye nombres en absoluto ... – EJP

4

Extern "C" se usa para indicar un estilo de enlace C en lugar de estilo C++. El compilador de C++ agrega información de tipo al símbolo de la función, pero el compilador de C no.

Si su biblioteca tiene que ser utilizada por una aplicación externa, extern "C" es obligatorio porque los compiladores de C++ son en su mayoría incompatibles con respecto a la información del tipo. Este es el caso cuando tiene que crear una implementación nativa en Java, por ejemplo.

2

Extern "C" indica un estilo de vinculación C en lugar de un estilo C++. Le dice al compilador "por favor no destruya mis nombres de funciones". Se usa para que un programa C++ pueda vincularse con un programa C. Si está convirtiendo algo a Java, probablemente sea seguro ignorar esto. Esta línea solo sería importante si intentas convertir el código a C o C++.