VS2010编译器工具cl对c++11标准支持情况测试

本文探讨了VS2010编译工具cl对C++11标准的支持情况,提供了利用C++11新特性的两段代码来进行测试,并同g++ 4.9.3编译器的编译情况相对比。总的说来:VS2010的编译器工具cl部分支持了C++11标准,而g++ 4.9.3则全部支持C++11标准。虽然现在已出现了C++14等新的标准,但熟悉了C++11标准的支持情况有利于我们正确选用符合自己需要的编译工具。

1. 问题产生

一个月前由于编写算法的而使用C++语言,看了一些英文版的算法设计和分析书。一个偶然的机会发现了C++11标准,并且许多不同的编译器已经完全支持该标准。并且我利用g++ 4.9.3编译已经编写和实验了具有C++11特性的程序了,这是一个月前的事情。由于电脑系统是Win7,我曲线救国,先安装Cygwin,然后在其上运行g++编译器。

忽然有一天,我发问:为什么要绕一个圈呢?我的电脑上早已经按照了VS2010,为什么不利用命令行编译工具cl.exe呢?于是,我转向使用cl来编译一些C++程序。在阅读[(Nicolai M. Josuttis, 1999)][1]的时候,我利用cl工具编译和运行了书中的绝大部分程序,因为数字讲解的程序都符号C++98标准,VS2010中的cl必然能够编译C++98程序。在读[该书][1]的时候,去该书的网站寻找Errata表,却发现了该书已经出版了最新的[第二版][2],改版相对第一版增加了300多页,讲解了C++11标准。我本人也正好想了解C++11标准,于是读完第一版后,找来第二版继续读。书中有下面的程序:

//lang/lambda1.cpp
#include <functional>
#include <iostream>

std::function<int(int,int)> returnLambda() {
    return [](int x, int y) {
        return x*y;
    };
}

int main() {
    auto lf = returnLambda();
    std::cout << lf(6,7) << std::endl;
}

这是作者为了讲解C++11的新特性而给出了例子。本来利用g++ 4.9.3确定可以编译此程序,出于惯性使然,我却继续使用VS2010中的cl来编译该程序。没想到,编译顺利成功。C++11是2011年8月份新出的标准,而2010年的VS如何能够支持它呢?难道是半年前的.net framwork的更新起作用了?带着这些疑问,我要把相关的问题探究清楚。

2 Visual Studio的详细的Compiler version

为了确定我当前使用的是否是真正的VS2010自带的编译器版本,而不是更新后的VS2012的cl (因为我更新的仅仅是.net framework, 按照推测,VS2010的可能性大些),我需要清楚地知道VS版本与cl compiler 版本间的对应关系。它们的对应关系如下:

VS版本 cl 版本
2013 18.XX.YYYYY.ZZ
2012 17.XX.YYYYY.ZZ
2010 16.XX.YYYYY.ZZ
2008 15.00.30729.01
2005 14.00.50727.762
2003 13.10.6030

然后查看我的cl版本为:

从上表中的数据我可以清楚地断定:我使用的cl版本确实就是VS2010自带的。这只能说明,虽然命名为VS2010,实际上它的推出可能要比2010年晚。

3 VS2010的cl对C++11支持的程度

知道了确实是VS2010后,下一个问题就需要知道它对C++11的支持程度。如果它能够完全支持,那么我阅读[第二版][2]的时候就直接使用cl就可以了,而不用转向g++。在MSDN网站上面有这个话题的详细介绍,请参见.

可以知道VS2010对C++11的支持能很有限,比如它就不支持Raw String,利用如下代码进行测试:

#include <iostream>
using namespace std;
/*
 *Name: rawString.cpp
 *Purpose: Test whether VS2010 to support
 * raw string, which is C++ new feature.
 */
int main() {
    cout << R"nc(a                 b\nc()"
                 )nc";
}

采用cl 16.XX和g++ 4.9.3编译的结果分别如下:

证明了VS2010的cl不支持C++ 11的Raw String新特性。看来,在阅读接下来[第二版]的时候,我只有先使用g++ 3.9.3编译器了,因为现在不打算升级VS2010到VS2015或者其他的高一级的版本。

4 结束语

C++11新特性的出现,更加方便了程序员的工作,因为它融合了好多函数式语言的许多优点,将其他语言的优点融合进来。当然也带来了语言学习量的增大。不过没关系,它兼容C++98/03等,如果你不想学习C++11,完全可以不顾它。它的优点是编程更加方便、程序性能提升。对应C++语言的特性越来越多,那就只有需要什么就去学习什么,而不用全部都去学习。

面对计算技术的迅猛发展,我们只有持续学习,善于学习,才能跟上时代的步伐,拥抱和使用新技术。

[1]: Nicolai M. Josuttis. The C++ Standard Library A tutorial and Reference. 1999.

[2]: Nicolai M. Josuttis. The C++ Standard Library A tutorial and Reference. 2nd edition. Upper Saddle River, NJ, USA: Addison-Wesley, 2012.

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-14 04:11:58

VS2010编译器工具cl对c++11标准支持情况测试的相关文章

Android NDK的C++11标准支持

C++11在Android NDK中已经支持了,本文主要介绍如何在NDK中添加C++11标准的支持. 在开源项目Cocos2d-x中,已经添加了C++11标准的支持. 1.修改Application.mk文件,添加NDK_TOOLCHAIN_VERSION NDK_TOOLCHAIN_VERSION=4.8 2.添加APP_CPPFLAGS,在命令行编辑时支持C++11 APP_CPPFLAGS := -frtti -std=c++11 然后编写测试函数,在JNI中调用此函数即可. #inclu

VS2010对c++11的支持情况验证

目前仅仅测试工作中 使用的比较多的: 智能指针 shared_ptr #include <memory> std::shared_ptr<A> a(new A); ----支持! 同时也支持 make_shared weak_ptr ----支持,毕竟这是个给shared_ptr打辅助的指针模板 unique_prt ----支持! ,但不支持make_unique,这也正常,毕竟这是C++14的语法了. 综合来看,可以在VS2010里自有的使用智能指针了. auto类型自推导 v

C++11标准之右值引用(rvalue reference)

1.右值引用引入的背景 临时对象的产生和拷贝所带来的效率折损,一直是C++所为人诟病的问题.但是C++标准允许编译器对于临时对象的产生具有完全的自由度,从而发展出了Copy Elision.RVO(包括NRVO)等编译器优化技术,它们可以防止某些情况下临时对象产生和拷贝.下面简单地介绍一下Copy Elision.RVO,对此不感兴趣的可以直接跳过: (1) Copy Elision Copy Elision技术是为了防止某些不必要的临时对象产生和拷贝,例如: struct A { A(int)

目前主流编译器对C++11特性的支持情况

1. GCC编译器(从编译器GCC4.8.X的版本完全支持) (1)目前C++11特性,之前成为C++0X特性,从GCC4.3的后续版本中逐步对C++11进行支持. (2)从官方信息可以看到,目前从完全对C++11特性进行支持的是从编译器GCC4.8.X的版本. 参考网址:https://gcc.gnu.org/projects/cxx-status.html#cxx11 2. Clang编译器 Clang 是一个 C++ 编写.基于 LLVM.发布于 LLVM BSD 许可证下的 C/C++/

C++11 标准新特性: 右值引用与转移语义

C++ 的新标准 C++11 已经发布一段时间了.本文介绍了新标准中的一个特性,右值引用和转移语义.这个特性能够使代码更加简洁高效. 查看本系列更多内容 | 3 评论: 李 胜利, 高级开发工程师, IBM 2013 年 7 月 10 日 内容 在 IBM Bluemix 云平台上开发并部署您的下一个应用. 开始您的试用 新特性的目的 右值引用 (Rvalue Referene) 是 C++ 新标准 (C++11, 11 代表 2011 年 ) 中引入的新特性 , 它实现了转移语义 (Move

C++11 标准新特性:Defaulted 和 Deleted 函数

前两天写的铁字中提到了C++的删除函数,今天特地去网上查了查,转载了一篇不错的文章... 转载自 http://www.ibm.com/developerworks/cn/aix/library/1212_lufang_c11new/index.html C++11 标准新特性:Defaulted 和 Deleted 函数 本文将介绍 C++11 标准的两个新特性:defaulted 和 deleted 函数.对于 defaulted 函数,编译器会为其自动生成默认的函数定义体,从而获得更高的代

【转】C++11 标准新特性:Defaulted 和 Deleted 函数

原文链接http://www.ibm.com/developerworks/cn/aix/library/1212_lufang_c11new/ 本文将介绍 C++11 标准的两个新特性:defaulted 和 deleted 函数.对于 defaulted 函数,编译器会为其自动生成默认的函数定义体,从而获得更高的代码执行效率,也可免除程序员手动定义该函数的工作量.对于 deleted 函数, 编译器会对其禁用,从而避免某些非法的函数调用或者类型转换,从而提高代码的安全性.本文将通过代码示例详

C++11标准 STL正则表达式 验证电子邮件地址

转自:http://www.cnblogs.com/yejianfei/archive/2012/10/07/2713715.html 我们最经常遇到的验证,就是电子邮件地址验证.网站上常见.各种网页脚本也都常用“正则表达式”(regular expression)对我们输入的电子邮件地址进行验证,判断是否合法.有的还能分解出用户名和域名.现在用C++语言实现一下电子邮件地址验证程序,用的是C++ 11标准新增加的STL正则表达式. 源代码如下,该代码已在Visual Studio 2010上验

C++11标准后的C++阅读书目

C++ 新标准 C++11 的发布导致了大批新书的出现,还有一些经典书籍也进行了更新.Andrew Binstock 在 Dr.dobbs 上给大家推介一些学习 C++ 必需的核心书籍. 1. <C++程序设计语言>英文第四版,作者: Bjarne Stroustrup 这本书已经被正式列为C++编程的权威书籍.它堪称语言界的权威,独具特色,书面清晰,由设计C++的Stroustup所著. 也许有些读者认为ANSI C++文档才是最佳选择,但是这本书作为一个十分简洁的参考书籍,更适合已经对该