__cdecl o __stdcall en Windows?
Actualmente estoy desarrollando una biblioteca C ++ para Windows que se distribuirá como una DLL. Mi objetivo es maximizar la interoperabilidad binaria; más precisamente, las funciones en mi DLL deben ser utilizables desde el código compilado con múltiples versiones de MSVC ++ y MinGW sin tener que volver a compilar el DLL. Sin embargo, estoy confundido acerca de qué convención de llamadas es mejor,cdecl
ostdcall
.
A veces escucho declaraciones como "la convención de llamadas C es la única garantizada para ser la misma en todos los compiladores", lo que contrasta con declaraciones como "Hay algunas variaciones en la interpretación decdecl
, particularmente en cómo devolver valores ". Esto no parece detener a ciertos desarrolladores de bibliotecas (como libsndfile) para usar la convención de llamada C en las DLL que distribuyen, sin ningún problema visible.
Por otro lado, elstdcall
a convención de llamadas parece estar bien definida. Por lo que me han dicho, todos los compiladores de Windows están obligados a seguirlo básicamente porque es la convención utilizada para Win32 y COM. Esto se basa en el supuesto de que un compilador de Windows sin compatibilidad con Win32 / COM no sería muy útil. Muchos fragmentos de código publicados en foros declaran funciones comostdcall
pero parece que no puedo encontrar una sola publicación que explique claramentepor qu.
Hay demasiada información conflictiva, y cada búsqueda que realizo me da diferentes respuestas, lo que realmente no me ayuda a decidir entre los dos. Estoy buscando una explicación clara, detallada y argumentada de por qué debería elegir una sobre la otra (o por qué las dos son equivalentes).
Tenga en cuenta que esta pregunta no solo se aplica a las funciones "clásicas", sino también a las llamadas de funciones miembro virtuales, ya que la mayoría del código del cliente interactuará con mi DLL a través de "interfaces", clases virtuales puras (siguiendo los patrones descritos, por ejemplo,aqu yall).