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,情況也類似。

  對於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是線程安全的。

  如果在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所帶給你的真正獨特魅力了,祝你好運!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章