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 poder usarse a partir de código compilado con múltiples versiones de MSVC ++ y MinGW sin tener que recompilar la DLL. Sin embargo, estoy confundido acerca de qué convención de llamadas es mejor cdecl
o stdcall
.
A veces escucho declaraciones como "la convención de llamada de 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 de cdecl
, particularmente en cómo devolver valores ". Esto no parece impedir que ciertos desarrolladores de bibliotecas (como libsndfile ) utilicen la convención de llamadas de C en las DLL que distribuyen, sin ningún problema visible.
Por otro lado, la stdcall
convención de llamada parece estar bien definida. Por lo que me han dicho, básicamente se requiere que todos los compiladores de Windows lo sigan porque es la convención utilizada para Win32 y COM. Esto se basa en la suposición 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 como, stdcall
pero parece que no puedo encontrar una sola publicación que explique claramente por qué .
Hay demasiada información contradictoria y cada búsqueda que hago 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 uno sobre el otro (o por qué los 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 de miembros virtuales, ya que la mayoría del código de cliente interactuará con mi DLL a través de "interfaces", clases virtuales puras (siguiendo los patrones descritos, por ejemplo, aquí y allá ).