Лучшее правило для двоичной совместимости MSVC - это использование интерфейса C.По моему опыту, единственная функция C ++, с которой вы можете обойтись, - это интерфейсы с одним наследованием.Поэтому представьте все как интерфейсы, использующие типы данных C.
Вот список вещей, которые не двоично совместимы:
- STL.Двоичный формат изменяется даже между отладкой / выпуском и в зависимости от флагов компилятора, поэтому лучше не использовать кросс-модуль STL.
- Кучи.Не
new
/ malloc
в одном модуле и delete
/ free
в другом.Есть разные кучи, которые не знают друг о друге.Другая причина, по которой STL не будет работать с кросс-модулями. - Исключения.Не позволяйте исключениям распространяться от одного модуля к другому.
- RTTI / dynamic_casting типы данных из других модулей.
- Не доверяйте никаким другим функциям C ++.
Короче говоря, C ++ не имеет согласованного ABI, но C имеет, поэтому избегайте использования функций C ++, пересекающих модули.Поскольку одиночное наследование - это простая v-таблица, вы можете использовать ее для предоставления объектов C ++, при условии, что они используют типы данных C и не выполняют распределения между кучами.Этот подход используется и самими Microsoft, например, для Direct3D API.GCC может быть полезен для обеспечения стабильного ABI, но стандарт не требует этого, и MSVC использует эту гибкость.