2015-03-31 65 views
3

windows.h文件有以下幾行:爲什麼windows.h禁用包警告?

#ifndef __WINDOWS_DONT_DISABLE_PRAGMA_PACK_WARNING__ 
#pragma warning(disable:4103) 
#endif 

我發現我們有編譯包警告重新排序一些包含文件後。發生不良聯盟的風險似乎很嚴重。爲什麼Microsoft會禁用此警告?

+0

問問微軟?它們的標題。 – Mgetz 2015-03-31 16:57:24

+1

包括'Windows.h'是你不需要的東西。儘可能避免最好。由於這樣的原因。 – Chad 2015-03-31 16:58:04

+1

或定義'__WINDOWS_DONT_DISABLE_PRAGMA_PACK_WARNING__'。 – 2015-03-31 17:04:20

回答

5

請參閱here

實質上,WINDOWS.H包括多個子報頭其中許多限定結構的重新映射一些硬件定義的字段(這樣,不需要填充)

由於壓入/彈出未在每個子進行包括,它會禁用4103警告以避免虛假警告出現。

MS本身推薦將windows.h作爲第一個或最後一個include,但不能混用它。不是一個很好的選擇,但考慮windows.h大約25年以上,它定義的一些函數和結構仍然是一樣的...而其他一些不能在不破壞現有應用程序的情況下返工。

<windows.h>本身通過確保所有涉及到的不包含你自己的子標題確保正確的恢復都包含在正確的順序中。

如果您啓用該警告,您將看到所有這些內部不匹配windows.h掩蓋。

+0

一個重要的缺失細節是,windows.h本身是否保留(通過推/彈出)包裝選項。 – 2015-03-31 18:13:38

+0

'#pragma push/pop'功能比'#pragma pack'更新。有許多子頭文件可以設置打包而不需要push/pop,而其他的只有在假設其他人會做相應的pop時纔會進行推送。 windows.h本身可以確保正確的配對,但是如果啓用該警告,則會在子標題中看到不匹配,因此不應直接包含自己。 – 2015-03-31 18:30:28

+0

瞭解了,但是大家需要知道的,你沒有回答的是「請問'#include '改變有效結構打包,還是事先恢復有效?不管涉及多少個子頭。 – 2015-03-31 18:32:14