2011-02-16 30 views
5

He estado leyendo el archivo stdio.h y estoy confundido.Significado de la declaración de la función

Por ejemplo, no es esta línea:

_CRTIMP FILE* __cdecl __MINGW_NOTHROW fopen (const char*, const char*); 

que sé "FILE *" significa volver tipo y me encontré taht _CRTIMP es constante definida como

# ifndef _CRTIMP 
# define _CRTIMP __declspec(dllimport) 
# endif 

pero yo no entiendo de todos modos ¿Para qué sirve? ¿Y qué son el resto de las cadenas (__cdecl, __MINGW_NOTHROW)?

Respuesta

5

__declspec(dllimport) especifica que la función debe importarse desde una dll separada; Supongo que, dependiendo de la configuración de enlace estático/dinámico CRT, se define de diferentes maneras.

__cdecl es la convención de llamadas utilizada para la función; la convención de llamadas le dice al compilador cómo espera que se llame la función (en qué orden se presionan los parámetros en la pila, si se usa cualquier registro para los parámetros, dónde se almacena el valor de retorno, quién es responsable de la limpieza de la pila, ...); en general, no debes preocuparte por eso, siempre y cuando no estés escribiendo librerías.

__MINGW_NOTHROW es #define d expandirse a __attribute__ ((__nothrow__)), que es una extensión MinGW específica que le dice al compilador que la función no lanzar excepciones; esto permite que el compilador realice algunas optimizaciones.

Tenga en cuenta que no se trata de atributos C estándar, sino de compilación/plataforma específica. Una vez más, en general no debe preocuparse por ellos, están obligados a hacer que el CRT funcione bien, pero mientras no esté construyendo bibliotecas, puede escapar sin saber nada al respecto.:)

1

__declspec(dllimport) le dice al compilador que esta función debe importarse desde una DLL, es una extensión específica de Windows. Ver this page para más detalles.

Del mismo modo, __cdecl es un atributo que especifica que la función utiliza una convención de llamada particular (es decir, la utilizada por C). Ver this page.

Supongo que la macro __MINGW_NOTHROW es un sinónimo del atributo GCC nothrow, que informa al compilador que la función en cuestión no puede generar excepciones. Vea el documentation para más detalles.

0

Las tesis son declaraciones específicas del entorno o el compilador que está utilizando.

  • El __declspec(dllimport) indica, en las ventanas, que esta función está en un DLL y debe ser colocado en la tabla de importación del archivo ejecutable generado PE.
  • El __cdecl indica una convención de llamadas C estándar y modificará la forma en que el compilador transforma la función para cumplir con esta convención de llamadas.
  • __MINGW_NOTHROW es específico de su compilador y podría desactivar la compatibilidad con excepciones.

En todo caso, debe haber una explicación en la documentación de su compilador.

4

Usted debe echar un vistazo a _mingw.h y la gcc manual: En caso de gcc - o cualquier otro compilador de apoyo __GNUC__ - aplican las siguientes definiciones:

#define __cdecl __attribute__ ((__cdecl__)) 
#define __MINGW_NOTHROW __attribute__ ((__nothrow__)) 

El primero le dice al compilador que utilice el x86 cdecl convención de llamada (see gcc manual), esta última que garantiza que la función no arrojará excepciones de C++ (see gcc manual).

__declspec(dllimport) es necesario para realizar trabajo de vinculación dinámica (see gcc manual).

Cuestiones relacionadas