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.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM