Зараз я розробляю бібліотеку C ++ для Windows, яка буде поширюватися як DLL. Моя мета - максимізувати бінарну сумісність; точніше, функції в моїй DLL повинні використовуватися з коду, скомпільованого з декількома версіями MSVC ++ та MinGW, без необхідності перекомпілювати DLL. Однак мене бентежить, який згодний дзвінок найкращий, cdecl
або stdcall
.
Іноді я чую висловлювання на кшталт "Конвенція викликів C - це єдине, що гарантується однаковою для компіляторів", що контрастує із твердженнями типу " Існують деякі варіації в інтерпретації cdecl
, зокрема щодо повернення значень ". Здається, це не заважає певним розробникам бібліотек (наприклад, libsndfile ) використовувати домовленість викликів C у бібліотеках DLL, які вони розповсюджують, без видимих проблем.
З іншого боку, stdcall
домовленість про дзвінки видається чітко визначеною. З того, що мені сказали, усі компілятори Windows в основному повинні дотримуватися цього, оскільки це умова, що використовується для Win32 та COM. Це базується на припущенні, що компілятор Windows без підтримки Win32 / COM буде не надто корисним. Багато фрагментів коду, розміщені на форумах, оголошують функції як, stdcall
але я, здається, не можу знайти жодної публікації, яка чітко пояснює, чому .
Там занадто багато суперечливої інформації, і кожен пошук, який я запускаю, дає мені різні відповіді, які насправді не допомагають мені вибрати між ними. Я шукаю чітке, детальне, аргументоване пояснення, чому мені слід вибрати одне над іншим (або чому ці два рівнозначні).
Зверніть увагу, що це питання стосується не лише "класичних" функцій, але також і викликів функцій віртуального члена, оскільки більшість клієнтських кодів взаємодіють з моєю DLL через "інтерфейси", чисті віртуальні класи (наступні шаблони, описані, наприклад, тут і там ).