如果调用者和函数都同意类的内存布局(即相同的编译器和设置),那么具有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;
}
该程序使用g ++ 4.9.2和clang 3.5进行编译和运行。 g ++没有发出警告,但clang发出以下内容:
test.cpp:4:29:警告:&#39; foo&#39;已指定C链接,但返回 不完整类型&#st; :: vector&#39;这可能与C不兼容 [-Wreturn型-C-联动]
这个错误对我没有意义,因为std::vector<int>
不是一个不完整的类型。此代码创建std::vector<int>
实例的事实表明std::vector<int>
是完整类型。
答案 0 :(得分:0)
我会在C接口上使用shared_ptr返回对象。关于这一点的好处是当对象不再可访问时,将在对象上调用正确的删除器。
自: http://en.cppreference.com/w/cpp/memory/shared_ptr/shared_ptr
存储与r关联的删除程序,以便将来删除托管对象。
另见Scott Meyers关于此主题的条目:
了解删除器如何在Boost的shared_ptr中工作 http://www.artima.com/cppsource/top_cpp_aha_moments.html
更好的是在接受的答案中讨论交叉DLL问题: Is it OK to use boost::shared ptr in DLL interface?
由于返回类型不是函数名称修改的一部分。如果您愿意,您仍然可以使用C风格的链接。