不受限制的联合是否与 C 兼容

Are Unrestricted unions compatible with C?

本文关键字:兼容 是否 受限制      更新时间:2023-10-16

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

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

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

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

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

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

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