是否有可能修复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?
我正在为多个平台(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 标头,您的代码已经不可移植。
- 是否可以在编译时初始化数组,以便在运行时不会花费时间?
- 有没有一种方法可以在编译时获得作用域类名
- 是否可以在编译时限制类的实例数?
- 是否可以在编译时初始化对象的 C 样式函数指针,以便它调用对象的成员函数?
- C++ constexpr语言 - 可以在编译时评估值吗?
- 是否可以使C++类成为Objc类的委托
- 可以在编译时隐式引用类名吗
- 是否可以使一个类成为两个不同层次结构的子类?
- 加密蛋白使编译问题Ubuntu
- 是否有编译器标志可以使较新的 gcc 版本像旧版本一样构建
- std::结构复杂,使编译速度变慢
- 如果我的源文件中使用常数,则如何使编译很好地停止
- C 可以使destuructor不称为班级成员和基类攻击方的灾难
- 可以在编译时或运行时检查STD ::对齐的限制
- 是否可以在编译后创建 CMake 目标和文件目录?
- 为什么可以在编译时访问非常量、非静态成员而无需类的实例
- C++可以从编译为 wasm 的 C# 调用吗?
- 此模板函数在哪里生成?可以通过g++编译,但不能在Visual Studio中编译
- 是否可以进行编译,以使错误的std::vector访问调用退出程序,并显示有用的错误消息
- c++ 03:是否有一种方法可以使一个类型每次被包含在模板形参中时都会编译成不同的类型?