是否有可能修复Windows标头(winnt.h,windefs.h),以便可以使用/Za编译它们

Is it it possible to fix Windows headers (winnt.h, windefs.h) so they can be compiled with /Za?

本文关键字:可以使 编译 Za windefs 有可能 Windows 标头 是否 winnt      更新时间:2023-10-16

我正在为多个平台(Windows,Linux,Mac OS X)开发一个应用程序,我想确保我的代码符合ISO C++标准。在Linux和Mac上,它是通过-pedantic-errors标志实现的,在Windows上 - 使用/Za标志(禁用语言扩展)。问题是,一些 Windows 标头不符合 C++ 标准(以一种愚蠢的方式,没什么大不了的 - 大多数错误都是'$' : unexpected in macro definition'__forceinline' not permitted on data declarations和类似的废话)。您认为可以修复标头吗?有人试过吗?

不,这是不可能的。有关 STL(这个家伙,不是首字母缩略词)在 Clang 开发人员邮件列表中开始的关于此事的可爱讨论,请参见此处。

话虽如此,如果你想编写标准的符合标准的代码,我建议在Windows上使用MinGW-w64 GCC,它提供了自己的Win32 API标头,可以使用-std=c++11 -pedantic -Wall -Wextra进行编译。我甚至可以为您提供Clang 3.2。它只有32位,依赖于GCC 4.6的libstdc++,但它们相处得很好。我家里的电脑上有一个 Clang 3.3 版本,但 libstdc++ 和 Clang 在一些可变参数模板链接问题上存在分歧,所以我还没有上传它。

既然你想写一个可移植的代码 - 去做吧。您的窗口标题与它无关。例如,将代码移植到Linux后,您将没有它们,因此不要打扰。

您的代码(您编写的代码)必须是可移植的,因此不必担心某些标头中的__forceinline甚至不会在您可能使用的任何不同平台上。

所以 - 不要为不是来自你的代码的警告而烦恼。

更新:如果这些生成警告,您可以暂停它们。如果出现错误,您可以尝试以下操作:

  • 至于_forceinlilne这只是(至少在不同的编译器中)只是编译器尽可能努力内联 sth 的建议 - 但不能强制它 - 如果您真的需要,您可以安全地删除它
  • 至于其他错误 - 请举例说明

一种可能的解决方案是使用 mingw/cygwin gcc 和它们附带的 winapi 标头。它们不完整,因此如果您使用的是较新的东西,则可能需要从 Windows SDK 复制一些声明。但是,正如其他人提到的,如果您使用的是 Windows 标头,您的代码已经不可移植。