gpt4 book ai didi

c++ - 从共享库调用带有 STL 参数的函数

转载 作者:可可西里 更新时间:2023-11-01 16:18:25 28 4
gpt4 key购买 nike

我知道不可能安全地导出函数 C++ 参数(例如 STL 字符串),因为 C++ 没有指定标准 ABI。 (我读过它作为对 How to call a function from a shared library? 的回答)

人们倾向于相信如果您的库和程序都是使用相同的编译器构建的那么这不是问题,但不幸的是,对于某些 VC++ 编译器而言,这并不完全正确.

Herb Sutter 和 Alexandrescu 在“C++ 编码标准”中建议依赖可移植类型(例如内置类型)而不是采用 string 的函数。 .

ie 而不是使用 std::string在模块接口(interface)中

 std::string Translate( const std::string & );

使用一个

void Translate( const char *src, char* dest, size_t destSize );

虽然他们同意这对调用者和被调用者来说都相当复杂,但他们没有提出更好的替代方案。

如何才能很好地传递一个更复杂的对象,例如 std::map使用低级类型? (更不用说像 map<string,vector<something_complex> > 这样复杂的东西了)

导出函数时如何处理此类情况?

最佳答案

您不仅必须使用相同的编译器(或兼容的 ABI)构建程序,还需要使用相同的设置:调试和 Release模式、DLL 和静态模式、检查迭代器(或不检查),以及很快。一方面,STLPort 做对了:在为他们的库构建时,std::string 根据这些设置重命名为不同的符号,完全避免了这个问题。

另一种选择是将不透明指针传递给在 DLL 中分配、处置和使用的对象。实际上,如果您想将它们用作 DLL 外部的对象,则为您需要的函数创建您自己的虚拟接口(interface)。

关于c++ - 从共享库调用带有 STL 参数的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5637662/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com