2016-11-21 41 views
4

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?

+0

在C++中,'wchar_t'是一个分离的类型 – Danh

+0

也就是说,带有C链接的函数不包含在mangling中的类型,所以我不完全确定这样的变化会如何影响任何与C++相关的东西。另见[diff.wchar.t];没有这样的typedef会暴露给C++。 –

回答

5

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

名称重整是一种编译表示方法 - 对方式您在C++中定义的名称,以便它们符合“每个类”的限定条件,例如ClassA::method()不与ClassB::method()冲突 - 这也有利于超载,使ClassA::method(String s)不与ClassA::method(int i)冲突。

内部这些可能显示类似ClassA_methodClassA_method^StringClassA_method^int

如上第二主题讨论“名称重整不仅仅是一个编译器内部事务” - 在情况下,一个公共接口共享库正在生成,例如。

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

2

我假设你知道什么是捣鼓。如果不是一个好的解释是here

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

这通常也会被记录为this

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

3

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

在C中,name mangling是很少见的,对于标准的ABI,不包括类型名称。因此,wchar_t的真名不重要。

在C++中,wchar_t不是typedef。