【问题标题】:Why does MinGW automatically include <windef.h>为什么 MinGW 会自动包含 <windef.h>
【发布时间】:2011-04-01 18:12:11
【问题描述】:

我正在尝试以与平台无关的方式键入 DWORD,但遇到以下编译器错误:

...\mingw.org\mingw_gcc_4.5.0\bin\../lib/gcc/mingw32/4.5.0/../../
../../include/windef.h:229:23: error: 
'DWORD' has a previous declaration as 'typedef long unsigned int DWORD'

我希望能够依赖于我的 DWORD 实现,而不是依赖于知道它是什么的底层编译器(使用 typedef,而不是宏)。

为什么mingw (gcc 4.5.0) 在编译应用程序时会自动包含“windef.h”?

如何防止这种包含?

【问题讨论】:

    标签: c++ windows mingw


    【解决方案1】:

    我的 MinGW 似乎没有自动拉入 windef.h。我怀疑您的程序包含其他一些间接将其拉入的标题。您可以发布一个显示问题的简短程序吗?

    请注意,我看到您使用是否定义了_WINDEF_H 来确定这些东西是否已经被类型定义。这在使用 MinGW 时可能会起作用,但是当包含 windef.h 时,实际的 Windows SDK 定义了 _WINDEF_ - 至少一个特定版本。我想这是相当稳定的,但它肯定有可能在某个时候发生了变化。

    最好键入宏 MAKEWORD 之类的东西来检测是否已包含 windef.h - MAKEWORD 被记录为在 windef.h 中定义的宏,因此它在 SDK 中应该是稳定的版本,无论是否来自 Microsoft。

    【讨论】:

      【解决方案2】:

      解决了,

      它被 windows.h 包含,被 boost 头文件包含。

      定义这些类型定义的我的头文件只是寻找“_WINDEF_H”的存在 - 并且有一个规则,它必须是最后包含的头文件(为 Windows 头文件提供足够的时间被包含,从而否定需要我的 typedef)。

      【讨论】:

      • 您能否提供有关哪个 boost 头文件的信息?这是 Boost 最不受欢迎的行为。引入包含数千个宏符号的标题,这些宏符号可以随意与任何东西发生冲突。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-07-08
      • 2018-06-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-10
      • 1970-01-01
      相关资源
      最近更新 更多