2016-11-21 72 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。