如何在调用Legacy C API时正确地将指针施放到现代C 中的指针
How to correctly cast a pointer-to-struct to pointer-to-other-struct in modern C++ when calling legacy C API?
在调用旧的c api(例如 getnameinfo
)时,现代C 的正确方法是正确地将指针构造的参数施加到指针到指针的Antherts结构,类似的布局,但与原始结构的类层次结构无关?
例如,getnameinfo
接受其第一个参数A const struct sockaddr *
,但在将其交给const struct sockaddr_storage *
时也应起作用。但是,AFAIK简单地reinterpret_cast
-ing指针被C 标准视为UB。
在上面的示例中,给定一个sockaddr_storage
对象,将指针传递给getnameinfo
的正确方法是什么?
i可能正在误读标准,但是由于这些类型是标准布局类型,因此,如果您访问其常见的初始子序列,则不是UB。我相信[class.mem/23]是原因:
在与结构T1类型的活性成员的标准层结合中,可以读取结构T2类型的另一个联合成员的非静态数据成员M,前提是m是T1和T2;该行为似乎是提名的T1的相应成员。
这是工会的明确许可,从理论上讲,可以简单地使用编译器魔术来完成。但实际上我认为这意味着对于标准布局类,常见的初始序列在内存中具有相同的布局。
现在让我们考虑[BASIC.LVAL/8.6]:
如果程序试图通过 除以下类型之一以外的其他类型的glvalue行为是 未定义:
- ...
- 一种汇总或联合类型,其中包括其元素或非静态数据成员之间的上述类型之一(包括,包括, 递归地,亚聚集材料的元素或非静态数据成员或 包含工会),
- ...
当您放弃重新解释的指针时,您将获得一个骨料的glvalue,其中包括您访问的成员的类型。由于该成员属于常见的初始序列,因此应该很好。
我怀疑有一个理智的实现,在图书馆边界上它无法正常工作。
相关文章:
- 1d 智能指针不适用于语法 (*)++
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 为什么使用 "this" 指针调用派生成员函数?
- 函数向量_指针有不同的原型,我可以构建一个吗
- 使用指针从C++中的数组中获取最大值
- 助记符和指向成员语法的指针
- 嵌入方指针压缩已禁用
- 数组的指针从不分段故障
- C++ 指针的内存地址和指向数组的内存地址如何相同?
- 何时在引用或唯一指针上使用移动语义
- QMetaObject invokeMethod的基于函数指针的语法
- 正确施放以指向返回功能的函数的功能指针
- 将指针施放为成员函数作为C函数的指针是一个好习惯吗?
- 将数组的原始指针施放为unique_ptr
- 如何在调用Legacy C API时正确地将指针施放到现代C 中的指针
- 我如何从void *指针中动态施放
- 为什么不能从指针施放到模板功能中的指针
- 施放INT指针时编译错误
- 使用c 中的static_cast施放数组参考的指针是合法的吗?
- 如果我将(指向A类的指针施放为(指向其子类B)在C 中)会发生什么