C++ STL編程輕鬆入門 6

2.4 如何運行 數組

  在你尚未真正開始運行前面後兩個程序以前,最好先瀏覽一下本節。這裏簡單介紹了在特定編譯器環境下運行STL程序的一些細節,並提供了一些可能遇到的問題的解決辦法。安全

  此處,我選用了目前在Windows平臺下較爲常見的Microsoft Visual C++ 6.0和Borland C++ Builder 6.0做爲例子。儘管Visual C++ 6.0對最新的ANSI/ISO C++標準支持的並非很好。不過據稱Visual C++ .NET(也就是VC7.0)在這方面的性能有所改善。多線程

  你能夠選用多種方式運行前面的程序,好比在Visual C++下,你能夠直接在DOS命令行狀態下編譯運行,也能夠在VC的IDE下采用控制檯應用程序(Console Application)的方式運行。對於C++ Builder,狀況也相似。ide

  對於Visual C++而言,若是是在DOS命令行狀態下,你首先須要找到它的編譯器。假定你的Visual C++裝在C:\Program Files\Microsoft Visual Studio\VC98下面,則其編譯器所在路徑應該是C:\Program Files\Microsoft Visual Studio\VC98\Bin,在那裏你能夠找到cl.exe文件。編譯時請加上/GX和/MT參數。若是一切正常,結果就會產生一個可執行文件。以下所示:函數

cl /GX /MT example2_2.cpp

  前一個參數用於告知編譯器容許異常處理(Exception Handling)。在P. J. Plauger STL中的不少地方使用了異常處理機制(即try…throw…catch語法),因此應該加上這個參數,不然會有以下警告信息:性能

warning C4530: C++ exception handler used, but unwind semantics are not enabled.

  後一個參數則用於使程序支持多線程,它須要在連接時使用LIBCMT.LIB庫文件。不過P. J. Plauger STL並非線程安全的(thread safety)。若是你是在VC環境下使用像STLport這樣的STL實現版本,則須要加上這個參數,由於STLport是線程安全的。ui

  若是在IDE環境下,能夠在新建工程的時候選擇控制檯應用程序。命令行



圖3:在Visual C++ IDE環境下運行STL程序

  至於那些參數的設置,則能夠經過在Project功能菜單項中的Settings功能【Alt+F7】中設置編譯選項來完成。線程



圖4:在Visual C++ IDE環境下設置編譯參數

  有時,在IDE環境下編譯STL程序時,可能會出現以下警告信息(前面那幾個示例程序不會出現這種狀況):翻譯

warning C4786: '……' : identifier was truncated to '255' characters in the debug information

  這是由於編譯器在Debug狀態下編譯時,把程序中所出現的標識符長度限制在了255個字符範圍內。若是超過最大長度,這些標識符就沒法在調試階段查看和計算了。而在STL程序中大量的用到了模板函數和模板類,編譯器在實例化這些內容時,展開以後所產生的標識符每每很長(沒準會有一千多個字符!)。若是你想認識一下這個warning的話,很簡單,在程序里加上以下一行代碼:

vector<string>		string_array;		// 相似於字符串數組變量

  對於這樣的warning,固然能夠置之不理,不過也是有解決辦法的。 你能夠在文件開頭加入下面這一行:#pragma warning(disable: 4786)。它強制編譯器忽略這個警告信息,這種作法雖然有點粗魯,可是頗有效。

  至於C++ Builder,其DOS命令行狀態下的運行方式是這樣的。假如你的C++ Builder裝在C:\Program Files\Borland\CBuilder6。則其編譯器所在路徑應該是C:\Program Files\ Borland\CBuilder6\Bin,在那裏你能夠找到bcc32.exe文件,輸入以下命令,即大功告成了:

bcc32 example2_2.cpp

  至於IDE環境下,則能夠在新建應用程序的時候,選擇控制檯嚮導(Console Wizard)。



圖5:在C++ Builder IDE環境下運行STL程序

  如今你能夠在你的機器上運行前面的示例程序了。不過,請恕我多嘴,有些細節不得不提請你注意。當心編譯器給你留下的陷阱。好比前面第三個程序中有以下這一行代碼:

typedef back_insert_iterator< int_vector >	back_ins_itr;

  請留意">"前面的空格,最好不要省去。若是你吝惜這點空格所佔用的磁盤空間的話,那就太不划算了。其緣由仍是在於C++編譯器自己的缺陷。上述代碼,至關於以下代碼(編譯器作的也正是這樣的翻譯工做):

typedef back_insert_iterator< vector<int> >	back_ins_itr;

  若是你沒有加空格的話,編譯器會把">>"誤認爲是單一標識(看起來很像那個數據流輸入操做符">>")。爲了迴避這個難題,C++要求使用者必須在兩個右尖括號之間插入空格。因此,你最好仍是老老實實照個人話作,以免沒必要要的麻煩。不過有趣的是,對於上述那行展開前的代碼,在Visual C++裏即便你沒有加空格,編譯器也不會報錯。而一樣的代碼在C++ Builder中沒有那麼幸運了。不過,最好仍是不要心存僥倖,若是你採用展開後的書寫方式,則兩個編譯器都不會給你留情面了。

  好了,請原諒個人絮叨,如今你能夠親身感覺一下STL所帶給你的真正獨特魅力了,祝你好運!

相關文章
相關標籤/搜索