为什么 Extern-C 返回 POD 和构造类型的方式不同
Why does Extern-C return POD and constructed types differently?
在 Win32 上,我刚刚注意到将结构设为非 POD 会导致按值返回结构的函数的签名发生变化。
这是为什么呢?这是否意味着 C 不能声明 extern-C 函数的函数签名?
例如,如果预处理器看到__cplusplus,因此滑入一两个构造函数以及一些其他成员函数,从而生成具有相同布局的结构。那为什么会这样重要呢?
好吧,最终的答案只能由定义 ABI 的人给出,但可能的原因是 C 仅通过复制内存来复制结构,但对于非 POD,这种内存复制可能无法正常工作。而判断一个 memcpy 是否有效的信息可能在不同的文件中,即使所有信息都可用,编译器也可能无法决定(相当于停止问题)。因此,ABI 设计人员可能决定假设非 POD 是不可能的(即使在给定的情况下它实际上可能是可证明的,也不值得尝试)。
另请注意,从形式上讲,添加成员函数会使类型在C++中有所不同,并且有一个声明带有该成员函数而另一个声明没有该成员函数会使代码在技术上无法定义的行为,即使这既不影响类的布局,也不会影响类的 PODness(如非虚拟非特殊成员函数)。
相关文章:
- 字符类型转换不兼容
- C++模板/别名 - 模板参数列表中参数 1 处的类型/值不匹配
- 错误:"模板<类_Tp,类_Dp>类 std::unique_ptr"的模板参数列表中参数 1 的类型/值不匹配
- 为什么"fun(i)"被推导出为"fun<int&>"而不是"fun<int>",因为"i"是"int"的类型而不是参考?
- 创建模板类型而不新建/删除
- 成员引用基类型 'char' 不是 C++ 中的结构或联合
- "+=" 操作在类型之间不起作用 std::复杂<double>和__complex__双精度
- 何时使用表达式的类型(而不是类别)?
- 表达式必须具有类类型。不知道怎么解决
- 不同c++编译器之间的自动类型推导不匹配
- 调用的对象类型 'double' 不是 report() 函数的函数或函数指针
- 模板 ctor 类型推导不起作用(没有匹配的构造函数用于初始化 ...)与函数<>参数
- 在变量名后声明带有 () 的非内部类型与不使用变量名的行为不同。即 std::map<int,char>x(); - 这是怎么回事?
- 在 lambda 中从引用类型捕获的值的类型,不使用通用捕获
- 使用 AWS c++ 接口将文件上传到 s3 时内容类型标签不正确
- 有没有办法通过插入新类型名称而不是 int 来使用 2 位大小类型而不是 int?
- 模板参数列表中参数 3 处的类型/值不匹配
- 为什么函数返回类型中不允许参数推导?
- 在QtMultimedia的QAudioFormat中为24位,32位和64位音频选择哪种样本类型(而不是大小)?
- 我可以以某种方式不写出完整的限定返回类型名称吗?