【问题标题】:Why windows.h disables pack warning?为什么 windows.h 禁用包警告?
【发布时间】:2015-03-31 16:55:27
【问题描述】:

windows.h 文件中有以下几行:

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

我发现在重新排序一些包含文件后我们有编译指示包警告。对齐错误的风险似乎很严重。为什么微软要禁用此警告?

【问题讨论】:

  • 问微软?它是他们的标题。
  • 包含Windows.h 是您出于必要而做的事情。如果可能,最好避免。出于诸如此类的原因。
  • 或者定义__WINDOWS_DONT_DISABLE_PRAGMA_PACK_WARNING__
  • 通常需要使 PshPackx.h 和 PopPack.h #include 文件在不产生 1 级警告的情况下正常工作。它们在 SDK 标头中得到了很多使用。专注于就您要解决的问题提出问题,而不是问“为什么 X 做了 Y”。
  • @Chad:你可以定义WIN32_LEAN_AND_MEAN 来避免这些。但是你不能避免包括 windows.h

标签: c++ c windows memory-alignment


【解决方案1】:

here

基本上,windows.h 包含许多子标题,其中许多定义了重新映射某些硬件定义字段的结构(因此,不需要填充)

由于不是在每个子包含上都进行推送/弹出,因此它会禁用 4103 警告以避免出现虚假警告。

MS 本身建议将 windows.h 作为第一个或最后一个包含,但不要混合它。不是一个很好的选择,但考虑到 windows.h 已经有 25 多年的历史了,它定义的一些函数和结构仍然是相同的......而其他一些则无法在不破坏现有应用程序的情况下进行返工。

<windows.h> 本身通过确保您不应该直接包含自己的所有相关子标题都以正确的顺序包含在内,从而确保正确恢复。

如果您启用该警告,您将看到 windows.h 中的所有内部不匹配都被屏蔽掉了。

【讨论】:

  • 一个重要的缺失细节是 windows.h 本身是否保留(通过推送/弹出)打包选项。
  • #pragma push/pop 功能比#pragma pack 更新。有许多子标题设置没有推送/弹出的打包,其他仅推送假设另一个将执行相应的弹出。 windows.h 本身可确保正确配对,但如果您启用该警告,您将看到子标题中的不匹配,您不应直接包含自己。
  • 明白了,但是大家都需要知道而你没有回答的是“#include <windows.h>会改变有效的结构包装,还是恢复之前的有效设置?”无论涉及多少子标题。
  • 我希望我能再次 +1,这是一个很棒且完整的答案。
  • windows.h 应该执行 pragma warning(push)warning(pop) 而不是禁用包含文件的此警告。另外,我定义了宏来启用该警告,但我没有看到来自 windows.h 的任何新警告(visual 2010)。不过我明天会仔细检查
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-20
  • 2012-05-18
  • 1970-01-01
  • 2022-01-05
  • 2018-10-06
  • 2020-11-18
相关资源
最近更新 更多