• 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
    c()"
                     )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.

  • 相关阅读:
    验证车牌警车能源车
    两个二维数组组合并且日期相同的其他值相加
    运用phpExcel导出查询的数据
    JQ加减乘除运算
    获取url传递的参数、鼠标滚动加载事件
    SQL查询将数据按字段(2017-08-15 11:34:05)进行按月分组
    关于角色和权限控制数据表相关
    有关无限极分类并排序问题
    前端解决用户登录时,禁止chrome提示用户保存密码
    前端学习之iframe配合hash做菜单导航的问题:修改src跳转与contentWindow.location.replace('')的问题
  • 原文地址:https://www.cnblogs.com/brucemengbm/p/7093349.html
Copyright © 2020-2023  润新知