22

我想知道用 C++11 编写软件在 Windows 上的效果如何。使用 Windows 的本机编译器之一将是最舒适的(并且可能是最自然的) - 我在这里考虑 Visual Studio 2012 Express 或 Visual Studio 2013 Express。到目前为止我能找到的关于这件事的一切都是

  1. http://msdn.microsoft.com/en-us/library/vstudio/hh567368.aspx(VC10 和VC11的C++11特性对比,好像很差)
  2. http://blogs.msdn.com/b/vcblog/archive/2013/06/28/c-11-14-stl-features-fixes-and-break-changes-in-vs-2013.aspx(不是真的透明,并没有让我知道它的效果如何)

有没有人有任何经验当前的 Visual Studio 版本可以如何处理 C++11?我现在真的很想开始使用自动、lambda、可变参数模板、模板别名、初始化列表和右值引用(仅举几例)以及所有其他好东西,但如果 Windows 可能是一个问题,我可能不得不使用 C ++03 进一步。

另一种可能性似乎是在 Windows 上安装 LLVM 和 Clang。我的主要平台是 OSX,在该系统上 Clang 对 C++11 的支持非常好。但我读到 C++ 标准库 (libc++) 的 LLVM 版本在 Windows 上运行不佳。所以 LLVM/clang 可能不是一个选择。

您对 Windows 上的 C++11 开发有何看法?

谢谢!

4

7 回答 7

43

我只能给你我作为开发人员的经验,因为我一直在使用 Visual C++ 在 Windows 上构建最前沿的 C++ 几乎所有东西,同时还安装了几个其他编译器和 IDE(包括我自己在 Windows 上构建 Clang for Visual Studio 2012、2012 CTP 和 2013 预览版)。以下是我截至目前(2013 年 8 月 13 日)的经验,基于Herb Sutter 的谈话以及每天使用编译器的工作。

快速

在 Visual Studio / VC++ 的相反方向运行。对 C++11 的支持速度很慢,而且它们目前在编译器功能方面与 Clang 和 GCC 相比被压垮了。

现在

Visual C++ 的 C++11(和 C++14 支持)现在已经非常糟糕了。它们缺乏使 C++ 中的模板元编程非常棒的强大功能(using尤其是表达式)。

  • 使用现在不存在。我花了好几个小时将出色的 C++11 代码移植using到 VC++ 上,结果却让它在某些地方损坏、卡住,或者变得几乎无法维护。

  • CTP 中的可变参数支持非常糟糕,虽然它在 Visual Studio 2013 Preview 的编译器版本中变得更好,但它在遵循标准的复杂可变参数和模板表达式方面仍然相当糟糕(并且在 GCC 和 Clang 中编译良好)。

  • =delete现在=default几乎从 VC++ 中消失了;在充满希望的不久的将来,也许它会成功(根据路线图,它应该“很快”)(我必须为许多简单的类显式实现 r 值构造函数,一直到 8 类继承当我看到 GCC 和 Clang 用户使用 ) 免费获得我所有明确的硬编码工作时,这是最糟糕的一记耳光=default

  • 作为保留(主要是因为 Windows 操作系统代码和一些二进制兼容性),VC++ 中的 Empty-Base-Class-Optomizations 不起作用。不要期望您的类层次结构大小或成员布局至少得到优化(在std::tuple打包变量类型时注意您的排序)。

这就是我迄今为止接触到的所有挫败感。它们是可行的——我每天都必须和它们一起工作——但是如果你想要很好的 C++ 支持,你应该跳入 GCC 或 Clang 并以某种方式让它在你的机器上工作。

未来

如果你真的想要 C++11,你将需要等待大约一年,即便如此,Visual Studio 2013 的 VC++ 版本仍然会缺少一些功能(并且不要期望它们也没有错误)。2013 年的 VC++ 在许多地方仍然严重缺少 std::move 和明确的 r-value 支持,当您期望事情正常时会很痛苦。

警告

如果您不是一个强大的 Vim 用户,那么在您可以使用的 IDE(与 GDB/GCC 或 Clang 配合得很好)方面,您的选择会很少。

  • QtCreator 很好,可以与 MinGW 一起使用,并且通常功能齐全,足以完成工作。
  • 可以使用 Sublime Text,但您必须编写自己的构建系统或将其委托给其他东西。
  • Code::Blocks 的自动完成功能很不稳定,行为也很奇怪,而且 IDE 本身也很笨拙。
  • Eclipse 应该很好,但我对它的体验既笨拙又奇怪,有时输入滞后很奇怪(尽管使用 SSD 的 8.00 GB i7 Haswell 机器)。
  • 作为 IDE,Visual Studio 非常可靠。然后将 Visual Assist X 堆叠在顶部,它非常适合 C++ 编码。这确实是我继续坚持下去的唯一原因,但我已经在学习 Vim 方面取得了进展,所以到时候我基本上可以完全放弃 Visual Studio。

关于图书馆

VC++ 中的库支持非常完整(因为它们损坏的编译器让它们变得完整)。它具有正则表达式,而大多数其他库不存在或损坏正则表达式支持。但这并不意味着 VC++库与它所说的某些 C++11 功能配合得很好(图片来自melak47)。

最后

如果您希望代码能够在 Windows 中 100% 持续工作,那么您可能需要针对 VC++ 进行编程。另一个“好处”是您在 VC++ 中编写的代码是您可以编写的 C++/C++11 的最小子集,因此最终它应该可以在任何地方编译。当然,这与使用漂亮的 C++11 并享受它的想法背道而驰,所以……明智地选择你的毒药。

于 2013-08-13T15:44:05.007 回答
11

VC 对 C++11 的支持远未完成,但它确实包含了最重要的面向用户的特性。

这是另一件事。以我的经验,在 Windows 上安装 MinGW 或 Clang 很好,但你会遇到一些不便,因为几乎没有人为 Windows 的这些编译器预编译二进制文件(而很多人为 Visual Studio 预编译二进制文件)。

此外,据我所知,在图形调试、智能感知等方面,没有任何 Windows 环境可以像 Visual Studio 那样远程高级。当我尝试 Code::Blocks 时,它实际上并没有起作用。

于 2013-08-13T15:33:20.107 回答
8

您可以在此处查看编译器对 C++11 语言功能的支持的全面比较。这是VS 的 C++11/14 路线图的一些信息。

MSVC 落后于其他主要的 C++ 编译器,但它仍然支持许多最重要的功能。

  • VS10 提供了 auto、lambdas 和 rvalue 引用。IIRC 有一个关于右值引用的警告,编译器不会生成移动构造和移动赋值运算符。

  • 可变参数模板和初始化器列表在 VS2013 预览版中可用,包括库支持。

  • 类型别名(即带有using关键字的 typedefs)预计将在 VS 2013 RTM 中可用。


如果您不需要与 VS 生成的二进制文件进行互操作,那么安装另一个编译器(例如 GCC)是可行的。我知道 Clang 也可以在 mingw 环境中工作,使用 libstdc++ 而不是 libc++。

于 2013-08-13T15:33:59.283 回答
5

http://nuwen.net/mingw.html

nuwen 发行版太棒了!它是 MinGW,但随着新 GCC 版本的发布,它的发布速度比 MinGW 快得多。它还附带了所有已编译的 boost 和其他有用的库。这就是我在 Windows 上使用的全部内容了。

于 2013-08-13T15:40:41.800 回答
2

我们已经在一些 here.com 产品的 Windows 和 linux 生产软件中使用 C++11 几个月了,没有任何问题。我们使用 auto、lambdas、range for... 使用 Visual Studio 2012 和 gcc 4.7。

于 2013-08-13T15:34:06.203 回答
2

我一直在使用 VS2012 并尽可能使用 C++11 功能。实现中存在一些错误,我发现当我从 Visual Studio 收到错误以进行比较时,使用另一个编译器很有帮助。

于 2013-08-13T15:35:15.303 回答
0

Clang 和 GCC 在 C++11 特性支持方面处于领先地位,就两者之间的 C++11 支持而言,这似乎是一场并驾齐驱的竞赛。可悲的是,MSVC 正气喘吁吁地试图跟上并落后。正如 Jake 所提到的,Nuwen MingGW 发行版非常出色,并且似乎与 Eclipse(Kepler 发行版)配合得很好,而且我在使用 Netbeans 7.4 时也没有遇到太多痛苦。Nuwen 发行版在撰写本文时当前版本为 11.2,正如您在Stephan 的网站上所见,现在是 x64-native,具有 GCC 4.8.1 和 Boost 1.54.0,GCC 的默认模式也设置为 C++ 11.

我当然开始越来越多地使用 Eclipse Kepler 和 Nuwen MinGW 而不是 MSVC 2012,但我基本上是一个 C++ 程序员爱好者,我的脚仍然湿透了,可能没有遇到 C++ 所针对的那些更晦涩的问题他们的面包和黄油可能知道。

于 2013-11-03T22:33:47.340 回答