什么是"兼容C ++ mangling"?

时间:2016-11-21 09:47:04

标签: c++ c compatibility glibc abi

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?

3 个答案:

答案 0 :(得分:5)

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

名称修改是编译表示您在C ++中定义的方法名称的方式,以便它们“按类”限定,因此例如ClassA::method()不会与ClassB::method()冲突 - 这还有助于重载,ClassA::method(String s)不会与ClassA::method(int i)冲突。

在内部,这些内容可能代表ClassA_methodClassA_method^StringClassA_method^int

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

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

答案 1 :(得分:3)

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

在C中,名称重整很少见,而标准ABI则不包括类型名称。因此,wchar_t的真实姓名无关紧要。

在C ++中,wchar_t不是typedef。

答案 2 :(得分:2)

我假设你知道什么是破损。如果没有一个好的解释是here

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

通常也会记录为this

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