Эта статья может показаться вам интересной Бинарно-совместимые интерфейсы C ++ .Урок, как правило, заключается в том, чтобы никогда не пропускать контейнер STL, Boost или что-либо подобное.Как и два других ответа, лучше всего придерживаться POD и функций с указанным соглашением о вызовах.
Поскольку реализации STL варьируются от компилятора к компилятору, передавать классы STL небезопасно.Затем вы можете либо потребовать от пользователя конкретной реализации STL (и, возможно, также конкретной версии), либо просто не использовать STL между библиотеками.
Более подробно придерживайтесь соглашений о вызовах, где поведение можетсчитать кросс-компилятор по-дружески.Например, __cdecl
и __stdcall
будут обрабатываться одинаково на большинстве компиляторов, тогда как соглашение о вызовах __fastcall
будет проблемой, особенно если вы хотите использовать код в C ++ Builder.
Как статья« Бинарно-совместимый интерфейс C ++ » упоминает, что вы также можете использовать интерфейс, если вы помните несколько основных принципов.
- Всегда делайте интерфейсы чисто виртуальными классами (т.е. без реализаций).
- Убедитесь, что используется правильное соглашение о вызовах для функций-членов в интерфейсе (в статье упоминается
__stdcall
для Windows. - Держите память в чистоте по ту же сторону от границы DLL.
- И многие другие вещи, например, не используйте исключения, не перегружайте функции винтерфейс (компиляторы относятся к этому по-разному) и т. д. Найдите их все в нижней части статьи.
Возможно, вы захотите прочитать больше о объектной модели компонентов (COM), если решите использоватьИнтерфейсы C ++, чтобы получить представление о том, как и почему это будет работать в разных компиляторах.