【问题标题】:C++11 on WindowsWindows 上的 C++11
【发布时间】:2013-08-13 15:14:06
【问题描述】:

我想知道用 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-breaking-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 开发有何看法?

谢谢!

【问题讨论】:

  • “我真的很想开始使用 auto、lambdas ...” -- Visual Studio 从 v10 开始就支持这两种方法。你还想用什么?
  • 我刚刚提到了我首先想到的两个功能。链接#1中的表格。我发布的内容给我的印象是v10和v11还不能很好地处理C++11...
  • 你也可以去GCC4.7+/MinGW
  • 对我来说,现在避免使用 VC++ 的原因是有一些错误的可变参数模板和非静态成员初始化器以及使用别名。此外,clang 的编译速度似乎比 VC++ 快了一个数量级。

标签: c++ windows c++11


【解决方案1】:

我只能向您介绍我作为开发人员的经验,因为我一直在使用 Visual C++ 在 Windows 上构建最前沿的 C++,同时还安装了几个其他编译器和 IDE(包括自己构建 Clang适用于 Visual Studio 2012、2012 CTP 和 2013 预览版的 Windows)。以下是我截至目前(2013 年 8 月 13 日)的经验,基于 Herb Sutter's talk 并每天使用编译器。

快速

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

现在

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

  • 现在不存在使用。我花了好几个小时将带有 using 的优秀 C++11 代码移植到 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 机器)。
  • Visual Studio 作为一个 IDE,非常可靠。然后将 Visual Assist X 堆叠在顶部,它非常适合 C++ 编码。这确实是我继续坚持下去的唯一原因,但我已经在学习 Vim 方面取得了进展,所以到时候我基本上可以完全放弃 Visual Studio。

关于库

VC++ 中的库支持非常完整(因为它们损坏的编译器让它们变得完整)。它具有正则表达式,而大多数其他库不存在或损坏正则表达式支持。但这并不意味着 VC++ library plays nice with some C++11 features that it says it does(图片来自 melak47)。

最后

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

【讨论】:

  • NetBeans 和 Eclipse 对 c++11 有合理的支持(用 GCC 测试)
  • 优秀的答案!非常感谢你! (而且我认为自己是一个强大的 vim 用户 :))
  • 请注意 emacs 作为 gcc/clang/gdb 的完整 IDE(尤其是 gdb,自动完成支持来自 emacs 的 clang)。即使是 VS2012 开发,也比 Visual Studio IDE 更好(使用 Makefile+cl.exe)。
  • 我会说emacs,但我对它的经验是0,并且OP没有提到它(尽管他提到了VIM)。不过,您的评论已被赞成,因此人们看到了 emacs + makefile + cl.exe 的优点:D
【解决方案2】:

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

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

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

【讨论】:

  • 因为我通常不使用 IDE(我使用 vim 来编辑我的代码,使用 shell 来编译它,并使用命令行调试器 [gdb on OSX] 来调试),这对我来说不是问题我……
【解决方案3】:

您可以查看here,了解编译器对 C++11 语言功能的支持的全面比较。 Here's 一些关于 VS 的 C++11/14 路线图的信息。

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

  • 自动、lambda 和右值引用可从 VS10 获得。 IIRC 有一个关于右值引用的警告,编译器不会生成移动构造和移动赋值运算符。

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

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


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

【讨论】:

  • 这是对 C++11 语言功能的一个很好的比较。你知道 library 特性有类似的吗?我的理解是 VS C++ 库相对于 C++11 几乎 100% 完成,但是其他编译器附带的库,比如 gcc,仍然有写时复制字符串,并且缺少像 这样的重要位。
  • @AdrianMcCarthy This 对 MSVC 的库、libstdc++ 和 libc++ 进行了比较。但是,它没有更新或包含诸如 std::string 是否仍然是 CoW 之类的详细信息。不过,我认为 libstdc++ 的 string 已经更新。
  • @Adrian GCC 的 libstdc++ 没有 COW 字符串,至少在 C++11 模式下是这样。据我所知,除了noexceptconstexpr 正确性以及与缺少语言支持相关的其他内容之外,该库(截至 MSVS2012)功能齐全。
  • 我找到了 gcc 的 C++11 库合规性列表:gcc.gnu.org/onlinedocs/libstdc++/manual/… 它没有专门解决写时复制字符串。我还发现这条评论表明它仍然在写时复制:gcc.gnu.org/onlinedocs/libstdc++/manual/…
  • 对不起,我之前评论中的第二个链接应该是:herbsutter.com/2013/05/13/gotw-2-solution-temporary-objects/…
【解决方案4】:

http://nuwen.net/mingw.html

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

【讨论】:

  • 他最近发布了 4.8.1,但我还没有对添加到 gcc 4.8.1 中的并发内容感到满意。 GCC 4.8.1 基本上是一个符合 C++11 的编译器,没有任何错误,并且对我认为的某些东西缺乏支持。
  • 另外,nuwen 是 32 位的,我上次检查过。
【解决方案5】:

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

【讨论】:

    【解决方案6】:

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

    【讨论】:

      【解决方案7】:

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

      我当然开始越来越多地使用 Eclipse Kepler 和 Nuwen MinGW 而不是 MSVC 2012,但我基本上是一个 C++ 程序员的爱好者,我的脚还在摸索,可能还没有遇到比那些更晦涩难懂的问题他们可能知道 C++ 是他们的生计。

      【讨论】:

        猜你喜欢
        • 2017-12-08
        • 2015-07-15
        • 1970-01-01
        • 2014-08-15
        • 2022-11-04
        • 2012-11-20
        • 2015-10-16
        • 2015-03-24
        • 1970-01-01
        相关资源
        最近更新 更多