Я знаю, что невозможно безопасно экспортировать параметры функции С++ (например, строки STL), потому что С++ не указывает стандартный ABI. (Я прочитал это как ответ Как вызвать функцию из общей библиотеки?)
Люди склонны полагать, что если и ваша библиотека, и ваша программа были построены с одним и тем же компилятором, это не проблема, но, к сожалению, для некоторых компиляторов VС++ это не совсем так.
Herb Sutter и Alexandrescu в "Стандартах кодирования С++" предлагают полагаться на переносные типы (например, встроенные типы) вместо функции, которая принимает string
.
т.е. вместо использования std::string
в интерфейсе модуля
std::string Translate( const std::string & );
используйте
void Translate( const char *src, char* dest, size_t destSize );
Хотя они согласны, что это довольно сложно как для вызывающего, так и для вызываемого абонента, они не предлагают более приятную альтернативу.
Как можно передать более сложный объект, например std::map
, используя типы низкого уровня? (не говоря уже о сложном, как map<string,vector<something_complex> >
)
Как вы решаете такие случаи при экспорте функций?