附录C 编译器支持
C++11是否能够在20世纪的第二个10年光芒依旧,必不可少地需要整个行业的生态环境的支持。这意味着一方面是C++11在学习使用上的闪光点深入人心,而另外一方面,则是有广泛的编译器支持。
如同我们在第一章中提到的,事实上,大多数编译器组织或厂商都在着手支持C++11。但C++11的特性非常多,以至于编译器组织或厂商通常需要若干个版本才能完全支持。在本书编写时,地球上的所有编译器都还未能完全地支持所有的C++11特性。不过这样的状况很快就会得到改变。一些开源的编译器项目,比如GCC以及Clang,应该在不久的时间内即将成为第一个完全支持C++11的编译器(现在从我们得知的情况看来,GCC可能会最早完成)。而商业编译器则相对会慢一些,而且是否完整支持C++11有时候也会依据客户需要而定。
在IBM Power平台上,最为常用的编译器是IBM的XL C/C++及GCC。截止本书完成,IBM的XL C/C++编译器的最新版本是XL C/C++V12.1,可以用于AIX以及Linux平台。XL C/C++V12.1支持了最为核心的特性,包括了:auto、c99、常量表达式constexpr、decltype、委托构造函数、显式类型转换operator、扩展的friend声明、外部模板、内联名字空间、long long、追踪返回类型的函数声明、右值引用以及移动语义、右尖括号、静态断言、强类型枚举、变长模板等。
此外,一如既往,IBM为所发布的特性都提供了良好的文档支持(请参见http://pic.dhe.ibm.com/infocenter/lnxpcomp/v121v141/index.jsp)。
而在x86及x86_64平台上,编译器在C++11的支持上则呈现了百花齐放的状态。从商业编译器上讲,主要是Intel的Intel C/C++编译器及微软的MSVC对C++11做了大量的支持。两者最新版本分别为Intel C/C++V13以及MSVC 2012(本书截稿时还没有正式发布)。
而在开源编译器上,GCC及基于llvm的clang则同样站在C++11支持的最前列。GCC对C++11的支持在http://gcc.gnu.org/projects/cxx0x.html可以找到,同样,clang对C++11的支持可以从http://clang.llvm.org/cxx_status.html上找到。可以看见,两款编译器除了依赖于底层的并行特性和少量未完成的特性外,大部分C++11的特性都已经得到了支持。
虽然两款编译器都实现了极高的C++11支持度,不过两者现在也并未默认开启C++11编译支持。程序员可以使用-std=c++11来打开C++11模式,而选项-std=gnu++11可以同时支持C++11和GNU的扩展功能。
注意 可能读者对clang编译器还不是非常了解。不过在我们的使用中,clang++编译器则表现了很好的实用性,clang++基本上兼容了所有的g++的编译选项,其错误输出在shell的支持下能够显示颜色,所以显得更加友好。有一些Linux的发布版中,我们已经看到使用clang代替gcc作为默认编译器的状况。
一些GCC中其他C++11相关选项则如表C-2所示。
如第一章所描述的,在本书编写时,我们主要使用了xl c/c++、gcc和clang三种编译器。因此对其状态也较为熟悉。其他的,比如跟Intel编译器同样使用EDG(Edison Design Group,一个专业的编译器前端厂商)前端的HP C/aC++编译器、Comeau编译器,以及Borland/CodeGear的C++Builder也都或多或少地加入了部分C++11的支持。