Pra*_*tic 5 c++ templates linkage
如果调用者和函数都同意类的内存布局(即相同的编译器和设置),那么具有C风格链接的函数返回从类模板实例化的类是否安全?
例:
#include <vector>
#include <iostream>
extern "C" std::vector<int> foo()
{
return {{1, 2, 3}};
}
int main()
{
const auto v = foo();
for (const auto& i : v)
std::cout << i << " ";
std::cout << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
该程序使用g ++ 4.9.2和clang 3.5进行编译和运行.g ++没有发出警告,但clang发出以下内容:
test.cpp:4:29:警告:'foo'指定了C-linkage,但返回了不完整类型'std :: vector',它可能与C [-Wreturn-type-c-linkage]不兼容
这个错误对我来说没有意义,因为std::vector<int>它不是一个不完整的类型.这段代码创建了一个完整类型的std::vector<int>演示实例std::vector<int>.
我将通过 C 接口使用共享指针返回对象。这样做的好处是,当对象不再可访问时,将调用适当的删除器。
\n\n来自:\n http://en.cppreference.com/w/cpp/memory/shared_ptr/shared_ptr
\n\n\n\n\n存储与r相关联的删除器以供将来删除被管理对象。
\n
另请参阅 Scott Meyers 关于此主题的条目:
\n\n\n\n\n了解删除器在 Boost\xe2\x80\x99s shared_ptr\n 中的工作原理 http://www.artima.com/cppsource/top_cpp_aha_moments.html
\n
更好的是这里接受的答案中对跨 DLL 问题的讨论:\n Is it OK to use boost::shared ptr in DLL interface?
\n\n由于返回类型不是函数名称修饰的一部分。如果您愿意,您仍然应该能够使用 C 样式链接。
\n