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 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 la mejor, cdecl
o stdcall
.__cdecl o __stdcall en Windows?
A veces escucho declaraciones como "la convención de llamadas C es la única garantizada para ser la misma en todos los compiladores", que contrasta con declaraciones como "There are some variations in the interpretation of cdecl
, particularly in how to return values". Esto no parece detener a ciertos desarrolladores de bibliotecas (como libsndfile) para usar la convención de llamadas C en las DLL que distribuyen, sin ningún problema visible.
Por otro lado, el convenio de llamadas stdcall
parece estar bien definido. Según lo que me han contado, todos los compiladores de Windows básicamente deben seguirlo 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 Win32/COM no sería muy útil. Una gran cantidad de fragmentos de código publicado en los foros de declarar funciona como stdcall
pero me parece que no puede encontrar uno solo puesto que explica claramente por qué .
Hay demasiada información contradictoria, y cada búsqueda que ejecuto me da respuestas diferentes que realmente no me ayudan a decidir entre los dos. Estoy buscando una explicación clara, detallada y argumentada sobre por qué debería elegir una sobre la otra (o por qué las dos son equivalentes).
Tenga en cuenta que esta pregunta no sólo se aplica a las funciones "clásicas", sino también para las llamadas a funciones miembro virtuales, ya que la mayoría código de cliente se conectará con mi DLL a través de "interfaces", clases virtuales puras (siguiendo las pautas descritas por ejemplo here y there)
"Hay algunas variaciones en la interpretación de cdecl, particularmente en cómo devolver valores" - esto significa aproximadamente que diferentes SO que usan cdecl en x86 pueden usar diferentes variantes de cdecl, que son diferentes ABI que ambos llaman "cdecl" . Windows elimina las variaciones, cualquier implementación que se ejecute en Windows y no respete las opciones de Windows no podrá llamar a las funciones de cdecl de Windows, así que como dices con stdcall, es inútil para la programación de Windows, y hay algunas C estándar funciones sería difícil de implementar. –