VS2010編譯器工具cl對c++11標準支持狀況測試

本文探討了VS2010編譯工具cl對C++11標準的支持狀況。提供了利用C++11新特性的兩段代碼來進行測試,並同g++ 4.9.3編譯器的編譯狀況相對照。總的說來:VS2010的編譯器工具cl部分支持了C++11標準,而g++ 4.9.3則全部支持C++11標準。php

儘管現在已出現了C++14等新的標準。但熟悉了C++11標準的支持狀況有利於咱們正確選用符合本身需要的編譯工具。ios

1. 問題產生

一個月前因爲編寫算法的而使用C++語言,看了一些英文版的算法設計和分析書。一個偶然的機會發現了C++11標準,並且不少不一樣的編譯器已經全然支持該標準。算法

並且我利用g++ 4.9.3編譯已經編寫和實驗了具備C++11特性的程序了,這是一個月前的事情。編程

因爲電腦系統是Win7。我曲線救國,先安裝Cygwin,而後在其上執行g++編譯器。markdown

突然有一天,我發問:爲何要繞一個圈呢?個人電腦上早已經依照了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的更新起做用了?帶着這些疑問,我要把相關的問題探究清楚。post

2 Visual Studio的具體的Compiler version

爲了肯定我當前使用的是不是真正的VS2010自帶的編譯器版本號,而不是更新後的VS2012的cl (因爲我更新的僅僅是.net framework, 依照猜測,VS2010的可能性大些)。我需要清楚地知道VS版本號與cl compiler 版本號間的相應關係。它們的相應關係例如如下:visual-studio

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.

相關文章
相關標籤/搜索