2009-08-18 12 views
8

Este typedef: sin embargoC++: typedefs de devolución de llamada con __stdcall en MSVC

typedef DWORD WINAPI 
(* CM_Open_DevNode_Key)(DWORD, DWORD, DWORD, DWORD, PHKEY, DWORD); 

compila bien en BorlandCpp,, cuando compilar en msvc Tengo que quitar WINAPI (que es sólo un alias para __stdcall):

typedef DWORD 
(* CM_Open_DevNode_Key)(DWORD, DWORD, DWORD, DWORD, PHKEY, DWORD); 

¿Por qué sucede esto? ¿Puedo eliminar la pieza WINAPI de forma segura?

actualización: tuve que quitar "WINAPI" formar el typedef, de lo contrario me dieron

error C2059: syntax error : '(' 

para la línea.

¿Puede decirme por qué Borland pudo compilarlo con "WINAPI" mientras que Msvc no?

+0

Lo sentimos, ahora está incluido. – George

Respuesta

13

Creo en VC++ que necesita poner la convención de llamadas dentro de() Aquí hay un example en MSDN de usar una convención de llamadas dentro de un puntero de función typedef.

typedef DWORD (WINAPI * CM_Open_DevNode_Key)(DWORD, DWORD, DWORD, DWORD, PHKEY, DWORD); 

Esto debería compilarse sin problemas.

+0

Gracias, este funciona:) – George

0

Un puntero de función debe tener información sobre la convención de llamada utilizada por la función. Si apunta a una función que usa la convención de llamadas __cdecl, debe usar un puntero de función __cdecl. Si apunta a una función que utiliza la convención de llamadas __stdcall, debe usar un puntero de función __stdcall.

Espero que esto ayude.

0

Nota al margen: Creo función typedefs firma debe nunca se pueden expresar como puntero typedefs.

Si se hubiera definido CM_Open_DevNode_Key a no ser puntero, cualquier declaración de cabecera de una función que es seguir esta firma de devolución de llamada podría simplemente haber sido escrito como

CM_Open_DevNode_Key myFunc;

en lugar de un excesivamente verboso/propenso a errores

DWORD WINAPI myFunc (DWORD, DWORD, DWORD, DWORD, PHKEY, DWORD);

Esto permitiría un código mucho más simple y un emparejamiento mucho más específico de las firmas de funciones, si es necesario.

no hablar de que typedefs puntero son malos en general, ya que permiten especificar DIS-constness del contenido siendo señalado (infame ejemplo: "PChar const" frente a la adecuadamente evaluado "const char *").

Cuestiones relacionadas