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