__cdecl ou __stdcall no Windows?

No momento, estou desenvolvendo uma biblioteca C ++ para Windows que será distribuída como uma DLL. Meu objetivo é maximizar a interoperabilidade binária; mais precisamente, as funções na minha DLL devem ser utilizáveis a partir de código compilado com várias versões do MSVC ++ e MinGW sem precisar recompilar a DLL. No entanto, estou confuso sobre qual convenção de chamada é a melhor,cdecl oustdcall.

s vezes, ouço declarações como "a convenção de chamada C é a única garantida para ser a mesma nos compiladores", que contrasta com declarações como "Há algumas variações na interpretação decdecl, particularmente em como retornar valores ". Isso parece não parar certos desenvolvedores de bibliotecas (como libsndfile) para usar a convenção de chamada C nas DLLs que distribuem, sem problemas visívei

Por outro lado, ostdcall convenção de chamada parece estar bem definida. Pelo que me disseram, todos os compiladores do Windows são basicamente obrigados a segui-lo, porque é a convenção usada para o Win32 e o COM. Isso se baseia na suposição de que um compilador do Windows sem suporte ao Win32 / COM não seria muito útil. Muitos trechos de código publicados nos fóruns declaram funções comostdcall mas não consigo encontrar um único post que explique claramenteporqu.

Há muitas informações conflitantes por aí, e todas as pesquisas que eu faço me dão respostas diferentes, o que realmente não me ajuda a decidir entre as duas. Estou procurando uma explicação clara, detalhada e argumentada sobre por que devo escolher uma sobre a outra (ou por que as duas são equivalentes

Observe que esta pergunta não se aplica apenas a funções "clássicas", mas também a chamadas de funções de membros virtuais, pois a maioria dos códigos de clientes fará interface com a minha DLL através de "interfaces", classes virtuais puras (seguindo os padrões descritos, por exemplo,Aqu eh).