2015-03-31 76 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