1

现在 C++11 允许您创建这样的联合

union U {
   int z;
   std::vector<char> data;
};

是否有可能以某种方式将此结构传递给接受常规 C 联合的 C 库?如何?

4

1 回答 1

2

你能通过那个工会吗?不会。std::vector(以及除 之外的所有其他标准容器std::array)不会生成已知布局的类型。它们可能是标准布局类型,但标准中没有呈现特定布局。因此,您不能将其传递给 C。

注意:通过“将其传递给 C”,我假设您的意思是“构建具有相同内存布局的等效 C 结构,以便 C 代码可以接触数据。”

但是你可以传递任何包含已知布局类型的联合,只要所有类型都是标准布局类型。它们不必是微不足道的,但它们必须是标准布局。

此外,如果您不介意特定于编译器,您可以查看您的特定std::vector实现(或使用特定实现,如boost::vector)并设计一个等效的 C 结构来存储基本相同的数据。当然,这是假设特定的实现确实是标准布局;C++ 标准并不要求它,并且分配器的存在可能会改变这一点。

于 2012-04-10T00:37:33.813 回答