什么是 "compatibility for C++ mangling"?

What is "compatibility for C++ mangling"?

wint_t 类型通过 stddef.hwchar.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 评论建议这样做 "breaks compatibility for C++ mangling"。

You can't change existing definitions of typedefs such as wint_t without breaking ABI compatibility (even when you have the same size and signedness and so are ABI-compatible for C, changing the underlying type breaks compatibility for C++ mangling).

那么,为什么这个 typedef 不能更改,什么是 "compatibility for C++ mangling"?

另见这个问题

下面是一些相关的定义:

名称修饰是编译表示您在 C++ 中定义的方法名称的方式,因此它们是合格的 "per class" 例如 ClassA::method() 不会与 [=11= 冲突] - 这也有助于重载,使得 ClassA::method(String s) 不会与 ClassA::method(int i).

冲突

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

上面的第二个主题讨论了 "name mangling is not merely a compiler-internal matter" - 例如,在为共享库生成 public 接口的情况下。

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

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

我还假设兼容性意味着它与各种编译器有关。我知道某些 ARM 编译器(例如 Keil)处理某些事情的方式与 desktop/server 上的标准 GCC 和 Clang 不同。

通常也会记录为 this

通过自行更改特定类型,您可以打破特定系统上名称重整的编译器默认映射。

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

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

在 C++ 中,wchar_t 不是 typedef。