В настоящее время я разрабатываю библиотеку C ++ для Windows, которая будет распространяться в виде DLL. Моя цель - максимизировать бинарную совместимость; более точно, функции в моей DLL должны быть пригодны для использования из кода, скомпилированного с несколькими версиями MSVC ++ и MinGW, без необходимости перекомпиляции DLL. Однако я не совсем понимаю, какое соглашение о вызовах лучше: cdecl
или stdcall
.
Иногда я слышу утверждения типа «Соглашение о вызове C - единственное гарантированное совпадение в разных компиляторах», что отличается от утверждений типа «. Существуют некоторые различия в интерпретации cdecl
, особенно в том, как вернуть значения". Похоже, это не мешает некоторым разработчикам библиотек (например, libsndfile ) использовать соглашение о вызовах C в распространяемых ими библиотеках DLL без видимых проблем.
С другой стороны, соглашение о вызовах stdcall
представляется вполне определенным. Из того, что мне сказали, все компиляторы Windows в основном обязаны следовать ему, потому что это соглашение используется для Win32 и COM. Это основано на предположении, что компилятор Windows без поддержки Win32 / COM не будет очень полезным. Многие фрагменты кода, размещенные на форумах, объявляют функции как stdcall
, но я не могу найти ни одного поста, который бы четко объяснял , почему .
Там слишком много противоречивой информации, и каждый поиск, который я выполняю, дает мне разные ответы, которые на самом деле не помогают мне выбирать между ними. Я ищу четкое, подробное, аргументированное объяснение того, почему я должен выбирать одно из другого (или почему два эквивалентны).
Обратите внимание, что этот вопрос относится не только к "классическим" функциям, но также и к вызовам виртуальных функций-членов, так как большая часть кода клиента будет взаимодействовать с моей DLL через "интерфейсы", чисто виртуальные классы (в соответствии с описанными здесь схемами, например, и там ).