什么是“兼容性C++修改”?
wint_t
类型在wchar.h
中通过stddef.h
设置,使用__WINT_TYPE__
已在编译器中默认定义的事实。因此,要改变什么是“兼容性C++修改”?
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++重整休息兼容性” 。
你不能改变现有的typedef的定义,如所述wint_t不破坏ABI兼容性(即使你有相同的大小和 的符号性,因此是对C ABI兼容,改变基本型 休息兼容性C++修改)。
那么,为什么这个typedef不能改变,什么是“兼容性C++修改”?
也看到这个问题How to change wchar.h to make wchar_t the same type as wint_t?
所以这里的一些相关的定义:
名称重整是一种编译表示方法 - 对方式您在C++中定义的名称,以便它们符合“每个类”的限定条件,例如ClassA::method()
不与ClassB::method()
冲突 - 这也有利于超载,使ClassA::method(String s)
不与ClassA::method(int i)
冲突。
内部这些可能显示类似ClassA_method
,ClassA_method^String
,ClassA_method^int
如上第二主题讨论“名称重整不仅仅是一个编译器内部事务” - 在情况下,一个公共接口共享库正在生成,例如。
因此,如果您采用typedef并将其更改为您自己的代码,那么对于您生成的所有二进制文件都可以,但任何预先存在的二进制文件(如依赖此typedef的第三方DLL)都会中断。
混合C和C++的另一种情况会伤害你。这个问题只在不存在的“C/C++”语言中才有意义。
在C中,name mangling是很少见的,对于标准的ABI,不包括类型名称。因此,wchar_t
的真名不重要。
在C++中,wchar_t
不是typedef。
在C++中,'wchar_t'是一个分离的类型 – Danh
也就是说,带有C链接的函数不包含在mangling中的类型,所以我不完全确定这样的变化会如何影响任何与C++相关的东西。另见[diff.wchar.t];没有这样的typedef会暴露给C++。 –