为什么 Extern-C 返回 POD 和构造类型的方式不同

Why does Extern-C return POD and constructed types differently?

本文关键字:类型 方式不 Extern-C 返回 POD 为什么      更新时间:2023-10-16

在 Win32 上,我刚刚注意到将结构设为非 POD 会导致按值返回结构的函数的签名发生变化。

这是为什么呢?这是否意味着 C 不能声明 extern-C 函数的函数签名?

例如,如果预处理器看到__cplusplus,因此滑入一两个构造函数以及一些其他成员函数,从而生成具有相同布局的结构。那为什么会这样重要呢?

好吧,最终的答案只能由定义 ABI 的人给出,但可能的原因是 C 仅通过复制内存来复制结构,但对于非 POD,这种内存复制可能无法正常工作。而判断一个 memcpy 是否有效的信息可能在不同的文件中,即使所有信息都可用,编译器也可能无法决定(相当于停止问题)。因此,ABI 设计人员可能决定假设非 POD 是不可能的(即使在给定的情况下它实际上可能是可证明的,也不值得尝试)。

另请注意,从形式上讲,添加成员函数会使类型在C++中有所不同,并且有一个声明带有该成员函数而另一个声明没有该成员函数会使代码在技术上无法定义的行为,即使这既不影响类的布局,也不会影响类的 PODness(如非虚拟非特殊成员函数)。

相关文章: