什么是 "compatibility for C++ mangling"?
What is "compatibility for C++ mangling"?
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 评论建议这样做 "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_method
、ClassA_method^String
、ClassA_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。
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 评论建议这样做 "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_method
、ClassA_method^String
、ClassA_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。