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

时间:2014-04-01 18:30:18

标签: c++ c return signature pod

在Win32上我刚刚注意到,构造一个非POD结构会导致返回struct by value的函数的签名发生变化。

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

例如,如果预处理器看到__cplusplus,那么在一个或两个构造函数中滑动以及其他一些成员函数产生具有相同布局的结构。那么为什么这么重要呢?

1 个答案:

答案 0 :(得分:1)

嗯,最终的答案只能由定义ABI的人给出,但可能的原因是C副本仅通过复制内存来结构,但对于非POD,这样的内存复制可能没有工作正常。并且确定memcpy是否有效所需的信息可能在不同的文件中,即使所有信息都可用,编译器也可能无法决定它(它等同于暂停问题)。因此,ABI设计师可能决定只假设非POD是不可能的(即使在特定情况下它可能实际上是可证明的,它也不值得尝试)。

另请注意,正式地说,添加成员函数会使C ++中的类型不同,并且具有一个声明和没有该成员函数的另一个声明会使您的代码在技术上处于未定义的行为,即使这既不会影响类的布局也不会影响类的POD(如非虚拟非特殊成员函数)。