2.4 如何運行在你還沒(méi)有真正開(kāi)始運行前面后兩個(gè)程序之前,最好先瀏覽一下本節。這里簡(jiǎn)單介紹了在特定編譯器環(huán)境下運行STL程序的一些細節,并提供了一些可能遇到的問(wèn)題的解決辦法。
此處,我選用了目前在Windows平臺下較為常見(jiàn)的Microsoft Visual C++ 6.0和Borland C++ Builder 6.0作為例子。盡管Visual C++ 6.0對最新的ANSI/ISO C++標準支持的并不是很好。不過(guò)據稱(chēng)Visual C++ .NET(也就是VC7.0)在這方面的性能有所改善。
你可以選用多種方式運行前面的程序,比如在Visual C++下,你可以直接在DOS命令行狀態(tài)下編譯運行,也可以在VC的IDE下采用控制臺應用程序(Console Application)的方式運行。對于C++ Builder,情況也類(lèi)似。
對于Visual C++而言,如果是在DOS命令行狀態(tài)下,你首先需要找到它的編譯器。假定你的Visual C++裝在C:\Program Files\Microsoft Visual Studio\VC98下面,則其編譯器所在路徑應該是C:\Program Files\Microsoft Visual Studio\VC98\Bin,在那里你可以找到cl.exe文件。編譯時(shí)請加上/GX和/MT參數。如果一切正常,結果就會(huì )產(chǎn)生一個(gè)可執行文件。如下所示:
cl /GX /MT example2_2.cpp
前一個(gè)參數用于告知編譯器允許異常處理(Exception Handling)。在P. J. Plauger STL中的很多地方使用了異常處理機制(即try…throw…catch語(yǔ)法),所以應該加上這個(gè)參數,否則會(huì )有如下警告信息:
warning C4530: C++ exception handler used, but unwind semantics are not enabled.
后一個(gè)參數則用于使程序支持多線(xiàn)程,它需要在鏈接時(shí)使用LIBCMT.LIB庫文件。不過(guò)P. J. Plauger STL并不是線(xiàn)程安全的(thread safety)。如果你是在VC環(huán)境下使用像STLport這樣的STL實(shí)現版本,則需要加上這個(gè)參數,因為STLport是線(xiàn)程安全的。
如果在IDE環(huán)境下,可以在新建工程的時(shí)候選擇控制臺應用程序。
圖3:在Visual C++ IDE環(huán)境下運行STL程序至于那些參數的設置,則可以通過(guò)在Project功能菜單項中的Settings功能【Alt+F7】中設置編譯選項來(lái)完成。
圖4:在Visual C++ IDE環(huán)境下設置編譯參數有時(shí),在IDE環(huán)境下編譯STL程序時(shí),可能會(huì )出現如下警告信息(前面那幾個(gè)示例程序不會(huì )出現這種情況):
warning C4786: ‘……‘ : identifier was truncated to ‘255‘ characters in the debug information
這是因為編譯器在Debug狀態(tài)下編譯時(shí),把程序中所出現的標識符長(cháng)度限制在了255個(gè)字符范圍內。如果超過(guò)最大長(cháng)度,這些標識符就無(wú)法在調試階段查看和計算了。而在STL程序中大量的用到了模板函數和模板類(lèi),編譯器在實(shí)例化這些內容時(shí),展開(kāi)之后所產(chǎn)生的標識符往往很長(cháng)(沒(méi)準會(huì )有一千多個(gè)字符?。?。如果你想認識一下這個(gè)warning的話(huà),很簡(jiǎn)單,在程序里加上如下一行代碼:
vector<string> string_array; // 類(lèi)似于字符串數組變量
對于這樣的warning,當然可以置之不理,不過(guò)也是有解決辦法的。 你可以在文件開(kāi)頭加入下面這一行:#pragma warning(disable: 4786)。它強制編譯器忽略這個(gè)警告信息,這種做法雖然有點(diǎn)粗魯,但是很有效。
至于C++ Builder,其DOS命令行狀態(tài)下的運行方式是這樣的。假如你的C++ Builder裝在C:\Program Files\Borland\CBuilder6。則其編譯器所在路徑應該是C:\Program Files\ Borland\CBuilder6\Bin,在那里你可以找到bcc32.exe文件,輸入如下命令,即大功告成了:
bcc32 example2_2.cpp
至于IDE環(huán)境下,則可以在新建應用程序的時(shí)候,選擇控制臺向導(Console Wizard)。
圖5:在C++ Builder IDE環(huán)境下運行STL程序現在你可以在你的機器上運行前面的示例程序了。不過(guò),請恕我多嘴,有些細節不得不提請你注意。小心編譯器給你留下的陷阱。比如前面第三個(gè)程序中有如下這一行代碼:
typedef back_insert_iterator< int_vector > back_ins_itr;
請留意">"前面的空格,最好不要省去。如果你吝惜這點(diǎn)空格所占用的磁盤(pán)空間的話(huà),那就太不劃算了。其原因還是在于C++編譯器本身的缺陷。上述代碼,相當于如下代碼(編譯器做的也正是這樣的翻譯工作):
typedef back_insert_iterator< vector<int> > back_ins_itr;
如果你沒(méi)有加空格的話(huà),編譯器會(huì )把">>"誤認為是單一標識(看起來(lái)很像那個(gè)數據流輸入操作符">>")。為了回避這個(gè)難題,C++要求使用者必須在兩個(gè)右尖括號之間插入空格。所以,你最好還是老老實(shí)實(shí)照我的話(huà)做,以避免不必要的麻煩。不過(guò)有趣的是,對于上述那行展開(kāi)前的代碼,在Visual C++里即使你沒(méi)有加空格,編譯器也不會(huì )報錯。而同樣的代碼在C++ Builder中沒(méi)有那么幸運了。不過(guò),最好還是不要心存僥幸,如果你采用展開(kāi)后的書(shū)寫(xiě)方式,則兩個(gè)編譯器都不會(huì )給你留情面了。
好了,請原諒我的絮叨,現在你可以親身感受一下STL所帶給你的真正獨特魅力了,祝你好運!