C++11 on Windows

C++11 on Windows

本文关键字:Windows on C++11      更新时间:2023-10-16

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

  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的能力?我真的很想现在就开始使用auto、lambdas、variadic模板、模板别名、初始值设定项列表和右值引用(仅举几个例子)以及所有其他好东西,但如果Windows可能有问题,我可能不得不进一步使用C++03。

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

你对Windows上的C++11开发有什么看法?

谢谢!

我只能告诉你我作为一名开发人员的经验,因为我一直在使用Visual C++在Windows上构建C++的前沿,同时还安装了其他几个编译器和IDE(包括在Windows上为Visual Studio 2012、2012 CTP和2013 Preview构建Clang)。以下是我到目前为止(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预览版的编译器中变得更好,但它在遵守标准的复杂变分和模板表达式方面仍然相当糟糕(在GCC和Clang中编译良好)。

  • CCD_ 3和CCD_;在充满希望的不久的将来,也许它会成功(根据路线图,它应该很快就会实现)(我不得不为许多简单类显式地实现r值构造函数,一直到8类继承层次结构。当我看到GCC和Clang用户免费获得我所有显式的=default硬编码工作时,这是最糟糕的一记耳光)。

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

这是我迄今为止接触到的所有挫折。它们是可以解决的——我每天都要和它们一起工作——但如果你想要出色的C++支持,你应该选择GCC或Clang,并以某种方式让它在你的机器上运行。

未来

如果你真的想要C++11,你将需要等待大约一年,即使到那时,Visual Studio 2013发布的VC++仍然会缺少一些功能(也不要指望它们没有错误)。2013年的VC++在许多地方仍然严重缺乏std::move和明确的r值支持,这让你在期望工作时感到痛苦。

洞穴

如果你不是一个强大的Vim用户,那么当涉及到可以使用的IDE(GDB/GCC或Clang)时,你的选择就很少了。

  • QtCreator很好,可以与MinGW一起工作,通常功能齐全,足以完成工作
  • Sublime Text可以使用,但您必须编写自己的建筑系统或将其委托给其他人
  • 代码::块的自动完成是不稳定的,行为怪异,IDE本身感觉很笨重
  • Eclipse应该是好的,但我对它的体验是笨拙和奇怪的,有奇怪的输入滞后(尽管有一台8.00 GB的i7 Haswell机器使用SSD)
  • Visual Studio作为一个IDE,是相当可靠的。然后将Visual Assist X堆叠在上面,它对C++编码非常有效。这确实是我继续坚持下去的唯一原因,但我已经在学习Vim方面取得了进展,所以我可以在时机成熟时完全放弃Visual Studio

关于图书馆

VC++中的库支持非常完整(因为它们的坏编译器让它们变得完整)。它有regex,而大多数其他库都不存在或不支持regex。但这并不意味着VC++库可以像它所说的那样很好地处理一些C++11功能(图片由melak47提供)。

最后

如果你想让你知道的代码在Windows中100%工作,那么你可能想用VC++编程。另一个"好处"是,你用VC++编写的代码是你可以用它编写的C++/C++11的最小子集,所以最终它应该到处编译。当然,这与使用漂亮的C++11并享受它的想法背道而驰,所以……明智地选择你的毒药。

VC的C++11支持还远远不够完整,但它确实包括了最重要的面向用户的功能。

还有另一件事。根据我的经验,在Windows上安装MinGW或Clang是可以的,但会给您带来一些不便,因为几乎没有人为那些针对Windows的编译器预编译二进制文件(而很多人都为Visual Studio预编译二进制文件)。

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

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

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

  • auto、lambdas和右值引用可从VS10中获得。IIRC对右值引用有一个警告,即编译器不会生成移动构造和移动赋值运算符。

  • VS2013预览版中提供了可变模板和初始值设定项列表,包括库支持。

  • 类型别名(即具有using关键字的typedefs)预计将在VS2013RTM中可用。


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

http://nuwen.net/mingw.html

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

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

我一直在使用VS2012,并在可能的情况下使用C++11功能。实现中存在一些错误,我发现当我从Visual Studio获得错误进行比较时,有另一个编译器是很有帮助的。

Clang和GCC在C++11功能支持方面处于领先地位,而在C++11支持方面,这两者似乎是一场势均力敌的竞争。微软风险投资公司(MSVC)正努力追赶并落后。正如Jake所提到的,Nuwen MingGW发行版非常出色,似乎与Eclipse(开普勒版本)配合得很好,我在Netbeans 7.4中使用它也没有遇到太多困难。在撰写本文时,Nuwen发行版目前的版本为11.2,正如你在Stephan的网站上看到的,现在是x64原生版本,具有GCC 4.8.1和Boost 1.54.0,GCC的默认模式也设置为C++11。

当然,我开始越来越多地使用Eclipse Kepler和Nuwen MinGW,而不是MSVC 2012,但我基本上是一个业余的C++程序员,仍在摸索,可能没有遇到那些以C++为生的人可能知道的更模糊的问题。