Attualmente sto sviluppando una libreria C ++ per Windows che verrà distribuita come DLL. Il mio obiettivo è massimizzare l'interoperabilità binaria; più precisamente, le funzioni nella mia DLL devono essere utilizzabili da codice compilato con più versioni di MSVC ++ e MinGW senza dover ricompilare la DLL. Tuttavia, sono confuso su quale convenzione di chiamata sia la migliore, cdecl
o stdcall
.
A volte sento affermazioni come "la convenzione di chiamata C è l'unica garantita per essere la stessa per tutti i compilatori", che contrasta con affermazioni come " Ci sono alcune variazioni nell'interpretazione di cdecl
, in particolare nel modo in cui restituire valori ". Ciò non sembra impedire ad alcuni sviluppatori di librerie (come libsndfile ) di utilizzare la convenzione di chiamata C nelle DLL che distribuiscono, senza problemi visibili.
D'altra parte, la stdcall
convenzione di chiamata sembra essere ben definita. Da quello che mi è stato detto, tutti i compilatori di Windows sono fondamentalmente tenuti a seguirlo perché è la convenzione utilizzata per Win32 e COM. Ciò si basa sul presupposto che un compilatore Windows senza il supporto Win32 / COM non sarebbe molto utile. Molti frammenti di codice pubblicati sui forum dichiarano funzioni come stdcall
ma non riesco a trovare un singolo post che spieghi chiaramente il motivo .
Ci sono troppe informazioni contrastanti là fuori e ogni ricerca che eseguo mi dà risposte diverse che non mi aiutano davvero a decidere tra i due. Sto cercando una spiegazione chiara, dettagliata e argomentata del motivo per cui dovrei scegliere uno rispetto all'altro (o perché i due sono equivalenti).
Si noti che questa domanda non si applica solo alle funzioni "classiche", ma anche alle chiamate di funzioni membri virtuali, poiché la maggior parte del codice client si interfaccia con la mia DLL tramite "interfacce", classi virtuali pure (seguendo i modelli descritti ad esempio qua e là ).