Ich entwickle derzeit eine C ++ - Bibliothek für Windows, die als DLL verteilt wird. Mein Ziel ist es, die binäre Interoperabilität zu maximieren. Genauer gesagt müssen die Funktionen in meiner DLL aus Code verwendet werden können, der mit mehreren Versionen von MSVC ++ und MinGW kompiliert wurde, ohne dass die DLL neu kompiliert werden muss. Ich bin jedoch verwirrt darüber, welche Anrufkonvention am besten ist cdecl
oder stdcall
.
Manchmal höre ich Aussagen wie "Die C-Aufrufkonvention ist die einzige, von der garantiert wird, dass sie für alle Compiler gleich ist", was im Gegensatz zu Aussagen wie " Es gibt einige Unterschiede bei der Interpretation von cdecl
, insbesondere bei der Rückgabe von Werten " steht. Dies scheint bestimmte Bibliotheksentwickler (wie libsndfile ) nicht davon abzuhalten, die C-Aufrufkonvention in den von ihnen verteilten DLLs ohne sichtbare Probleme zu verwenden.
Andererseits stdcall
scheint die Aufrufkonvention klar definiert zu sein. Nach allem, was mir gesagt wurde, müssen grundsätzlich alle Windows-Compiler diese befolgen, da dies die für Win32 und COM verwendete Konvention ist. Dies basiert auf der Annahme, dass ein Windows-Compiler ohne Win32 / COM-Unterstützung nicht sehr nützlich wäre. Viele in Foren veröffentlichte Codefragmente deklarieren Funktionen als, stdcall
aber ich kann anscheinend keinen einzigen Beitrag finden, der klar erklärt, warum .
Es gibt zu viele widersprüchliche Informationen, und jede Suche, die ich durchführe, gibt mir unterschiedliche Antworten, was mir nicht wirklich hilft, mich zwischen den beiden zu entscheiden. Ich suche nach einer klaren, detaillierten und argumentierten Erklärung, warum ich eine über die andere wählen sollte (oder warum die beiden gleichwertig sind).
Beachten Sie, dass diese Frage nicht nur für "klassische" Funktionen gilt, sondern auch für Funktionsaufrufe virtueller Mitglieder, da der größte Teil des Client-Codes über "Schnittstellen", reine virtuelle Klassen (gemäß den hier und da beschriebenen Mustern) mit meiner DLL verbunden ist .