wint_t
类型在wchar.h
内通过stddef.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?
答案 0 :(得分:5)
所以这里有一些相关的定义:
名称修改是编译表示您在C ++中定义的方法名称的方式,以便它们“按类”限定,因此例如ClassA::method()
不会与ClassB::method()
冲突 - 这还有助于重载,ClassA::method(String s)
不会与ClassA::method(int i)
冲突。
在内部,这些内容可能代表ClassA_method
,ClassA_method^String
,ClassA_method^int
正如上面讨论的第二个主题“name mangling不仅仅是编译器内部事务” - 例如,在生成共享库的公共接口的情况下。
因此,如果您使用typedef并为自己的代码更改它,那么您生成的所有二进制文件都可以,但任何预先存在的二进制文件(例如依赖于此typedef的第三方DLL)都将中断。
答案 1 :(得分:3)
混合C和C ++的另一种情况会伤害你。这个问题只有在不存在的“C / C ++”语言中才有意义。
在C中,名称重整很少见,而标准ABI则不包括类型名称。因此,wchar_t
的真实姓名无关紧要。
在C ++中,wchar_t
不是typedef。
答案 2 :(得分:2)