不受限制的联合是否与 C 兼容
Are Unrestricted unions compatible with C?
现在 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++标准并不要求它,分配器的存在可能会改变这一点。
相关文章:
- 码头化的C++应用程序是否向后兼容早期的内核版本
- OPENCV 3.2是否与CUDA 10兼容?我如何在使用CUDA 10的系统上编译和构建OpenCV 3.2
- 在C 中,是否有可能在不兼容类型的std ::向量对象之间传输不同类型的缓冲区
- 检查启发式方法是否兼容
- 是否可以安全地引用具有与模板不兼容的模板参数的C++模板类型?
- VS2015 SP3 C++运行时是否与SP2 C++运行时兼容
- 两个不完全相同的函数指针是否兼容
- 在 MSVC 中将某些库的目标平台版本设置为 10.x 是否使程序与在 Windows Vista/7/8 上运行不兼容
- 枚举类型布局是否与其基础类型兼容
- interpret_cast和c样式强制转换是否兼容(按照c++标准)
- gcc 的 -Wconversion 是否与使用比 int 短的整数类型的复合赋值(+= 等)不兼容?
- 映射/集合迭代器不兼容-检查对象是否在映射中
- 映射/集合迭代器不兼容-检查映射中是否存在键
- 不同的函数指针是否相互兼容
- _WIN32_WINNT标头中的定义更改,这是否会导致二进制不兼容
- ios::app 模式和 fstream::write 是否在某种程度上彼此不兼容
- 是否有适用于 sigma.js兼容 json 文件的专用格式
- Unix 和 Linux API 标头是否与C++兼容
- python C API是否与C++完全兼容
- 是否有任何兼容的 HTTP/HTTPS 库可以静态链接的 c++