C++11 on Windows
C++11 on Windows
我想知道用C++11编写软件在Windows上的效果如何。使用Windows的本机编译器将是最舒适的(当然也是最自然的)——我在这里考虑的是Visual Studio 2012学习版或Visual Studio 2013学习版。到目前为止,我能找到的关于这件事的一切都是
- http://msdn.microsoft.com/en-us/library/vstudio/hh567368.aspx(VC10和VC11的C++11特性比较,看起来相当糟糕)
- 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++为生的人可能知道的更模糊的问题。
- SFML 交叉编译 for Windows on Linux.
- Cmake with Flex/Bison on windows
- Boost::process on Windows - with MinGW?
- anaconda cythonize C++ on windows 10
- CMake & MinGW Compileilation on Windows,无需 -G "MinGW Makefiles"标志
- Windows Machine Learning (winML) on ARM
- 用于Clang on Windows的CMake生成器
- boost::stacktrace on Windows MSVS 2017
- TLS with http_listener in Microsoft cpprestsdk on Windows
- DirectX 11 on Windows 10
- CppFlow on windows 10
- OpenMP 4.5 on Windows with Clang, CMake & Ninja
- SDL 2.0.7 touch on Windows
- C++ on Jupyter Notebook for Windows
- WinHttpSendRequest and HTTPS on Windows XP
- OpenSSL on Windows and Visual Studio 2010
- 在 Windows for Linux on Intel 上编译C++库
- OpenCV on eclipse on windows
- C++ [[gnu::visibility( "default" )]] vs __declspec(dllexport) on Windows 和 Linux
- endian.h on Windows