1

我正在为多个平台(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以及类似的废话)。你认为有可能修复标题吗?有人试过吗?

4

3 回答 3

6

不,这是不可能的。有关 Clang 开发人员邮件列表中由 STL(这个人,而不是首字母缩写词)发起的关于该问题的可爱讨论,请参见此处

话虽如此,如果你想编写符合标准的代码,我建议在 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 在一些可变参数模板链接问题上存在分歧,所以我没有上传它。

于 2013-11-07T09:40:42.867 回答
4

既然你想写一个可移植的代码——那就去做吧。您的 Windows 标题与它无关。例如,在您将代码移植到 Linux 之后,您将没有它们,所以不要打扰。

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

所以 - 不要担心不是来自您的代码的警告。

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

  • 至于_forceinlilne这(至少在不同的编译器中)只是建议编译器尽量内联 - 但不能强制 - 如果你真的需要,你可以安全地删除它
  • 至于其他错误 - 请举个例子
于 2013-11-07T09:34:51.317 回答
0

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

于 2013-11-07T09:53:01.783 回答