可以安全地从具有C风格链接的函数返回类模板吗?

时间:2015-02-14 22:21:35

标签: 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;
}

该程序使用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>是完整类型。

1 个答案:

答案 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风格的链接。