【问题标题】:What is "compatibility for C++ mangling"?什么是“C++ 修改的兼容性”?
【发布时间】:2017-04-04 16:03:52
【问题描述】:

wint_t 类型通过stddef.h 设置在wchar.h 中,使用的是默认情况下在编译器中已经定义了__WINT_TYPE__。所以要改变

typedef unsigned int wint_t;

进入

typedef wchar_t wint_t;

我们可以在wchar.h开头使用下面的代码

#undef __WINT_TYPE__
#define __WINT_TYPE__ wchar_t
#define WEOF (-1)

this 评论表明这样做“破坏了对 C++ 修改的兼容性”。

你不能在不破坏 ABI 兼容性的情况下更改 typedef 的现有定义,例如 wint_t(即使你有相同的大小和 签名等与 C 的 ABI 兼容,改变了底层类型 破坏了对 C++ 修改的兼容性)。

那么,为什么这个 typedef 不能被改变,什么是“C++ mangling 的兼容性”?

另请参阅此问题How to change wchar.h to make wchar_t the same type as wint_t?

【问题讨论】:

  • 在 C++ 中,wchar_t 是一个分离的类型
  • 也就是说,具有 C 链接的函数不包括修饰中的类型,所以我不完全确定这样的更改会如何影响任何与 C++ 相关的内容。另见[diff.wchar.t];没有这样的 typedef 会暴露给 C++。

标签: c++ c compatibility glibc abi


【解决方案1】:

所以这里有一些相关的定义:

名称修饰是编译表示您在 C++ 中定义的方法名称的方式,因此它们是“按类”限定的,例如 ClassA::method() 不会与 ClassB::method() 冲突 - 这也有助于重载此类ClassA::method(String s) 不会与 ClassA::method(int i) 冲突。

在内部,这些可能表示为 ClassA_methodClassA_method^StringClassA_method^int

正如上面第二个主题所讨论的,“名称修改不仅仅是编译器内部的问题” - 例如,在生成共享库的公共接口的情况下。

因此,如果您使用 typedef 并将其更改为您自己的代码,那么您生成的所有二进制文件都可以,但任何预先存在的二进制文件(例如依赖此 typedef 的 3rd 方 DLL)都会中断。

【讨论】:

    【解决方案2】:

    混合使用 C 和 C++ 会伤害您的另一种情况。这个问题只在不存在的“C/C++”语言中才有意义。

    在 C 中,名称修改很少见,标准 ABI 不包括类型名称。因此,wchar_t 的真名是什么并不重要。

    在 C++ 中,wchar_t 不是 typedef。

    【讨论】:

      【解决方案3】:

      我假设你知道什么是重整。如果不是很好的解释是here

      我还假设兼容性意味着它与各种编译器有关。我知道某些 ARM 编译器(例如 Keil)在处理某些事情时与桌面/服务器上的标准 GCC 和 Clang 处理名称不同。

      这通常也会被记录为this

      通过自行更改特定类型,您可以破坏编译器默认映射以在特定系统上进行名称修改。

      【讨论】:

        猜你喜欢
        • 2014-12-17
        • 2018-01-09
        • 1970-01-01
        • 1970-01-01
        • 2017-10-02
        • 2013-02-05
        • 2022-12-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多