Unrestricted工会是否与C兼容?

时间:2012-04-10 00:02:13

标签: c++ c++11

现在C ++ 11允许你创建这样的联合作为

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

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

1 个答案:

答案 0 :(得分:2)

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

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

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

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