程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> VS2010編譯器工具cl對c++11標准支持情況測試

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

編輯:關於C++

本文探討了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 
#include 

std::function 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 
using namespace std;
/*
 *Name: rawString.cpp 
 *Purpose: Test whether VS2010 to support
 * raw string, which is C++ new feature.
 */
int main() {
    cout << Rnc(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.

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved