如何在调用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?

本文关键字:指针 施放 正确地 调用 Legacy API      更新时间:2023-10-16

在调用旧的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,其中包括您访问的成员的类型。由于该成员属于常见的初始序列,因此应该很好。

我怀疑有一个理智的实现,在图书馆边界上它无法正常工作。