2012-02-29 821 views
6

¿Por qué no se debe especificar extern "C" para una función que debe definirse como una función C? ¿Qué efecto tendría eso en el compilador al compilar el archivo como fuente C?¿Podríamos usar extern "C" en el archivo C sin #ifdef __cplusplus?

Si no hay ningún efecto en el compilador de C, ¿no podemos simplemente definir una función en un archivo de encabezado como el siguiente al eliminar la comprobación #ifdef __cplusplus?

extern "C" { 
    int MyFunc(); 
} 

An answer to another question dice que se necesita la #ifdef, pero no entiendo por qué:

Respecto # 2: __cplusplus se definirá para cualquier unidad de compilación que está siendo ejecutado a través del compilador de C++. En general, eso significa archivos .cpp y cualquier archivo incluido por ese archivo .cpp. El mismo .h (o .hh o .hpp o lo que-tiene-usted) podría interpretarse como C o C++ en diferentes momentos, si las incluyen diferentes unidades de compilación. Si desea que los prototipos en el archivo .h se refieran a los nombres de símbolos C, entonces deben tener extern "C" cuando se interpretan como C++, y no deben tener extern "C" cuando se interpretan como C - de ahí la comprobación #ifdef __cplusplus.

Respuesta

13

La construcción extern "C" es una construcción C++ y no está reconocida por un compilador de C. Por lo general, emitirá un mensaje de error de sintaxis.

Un truco común es definir una macro, por ejemplo EXTERN_C, que se expandiría a otra cosa dependiendo de si se compila con C o C++. Por ejemplo:

En un archivo de cabecera común:

#ifdef __cplusplus 
#define EXTERN_C extern "C" { 
#define EXTERN_C_END } 
#else 
#define EXTERN_C 
#define EXTERN_C_END 
#endif 

En otros archivos:

EXTERN_C 
int MyFunc(void); 
EXTERN_C_END 
+1

Gracias. No sabía que era una construcción C++. – Alexander

2

Si compila un archivo de origen como C, que se no reconocer extern "C", y lo haría generalmente resulta en un error de compilación.

Si compila un archivo fuente como C++, será y reconocerá extern "C", y se vincularán los nombres correctos.

Por lo tanto, solo puede usarlo de manera confiable para especificar nombres de símbolos C para archivos que compila como C++.

Si compila fuentes como C y C++, o sus interfaces están destinadas para clientes C y C++, tendrá que especificar esto de una forma u otra para que sus clientes obtengan los símbolos correctos al enlazar (y así sucesivamente))

relacionadas: Usted son permitido escribir extern "C++" - traducciones para C++.

Cuestiones relacionadas