现在C ++ 11允许你创建这样的联合作为
union U {
int z;
std::vector<char> data;
};
是否有可能以某种方式将此结构传递给接受常规C联合的C库?怎么样?
答案 0 :(得分:2)
你可以传递那个联盟吗?否std::vector
(以及除std::array
之外的所有其他标准容器)都不会生成已知布局的类型。它们可能是standard layout types,但标准中没有特定的布局。因此,您无法将其传递给C.
注意:通过“传递给C”,我假设你的意思是“构建一个具有相同内存布局的等效C结构,以便C代码可以触及数据。”
但是只要所有类型都是标准布局类型,您就可以传递包含已知布局类型的任何联合。它们不一定是微不足道的,但它们必须是标准的布局。
此外,如果您不介意特定于编译器,您可以查看特定的std::vector
实现(或使用类似boost::vector
的特定实现)并设计一个基本上存储的等效C结构相同的数据。当然,这假设特定的实现确实是标准布局; C ++标准并不要求它,并且分配器的存在可能会改变它。