2.3 C++兵器譜
正所謂“工欲善其事,必先利其器”,而要想做好C++程序設計,自然也離不開幾件像樣的兵器。下面我們就來看看C++兵器譜上有哪些神兵利器值得我們學習掌握。排在兵器譜上首要位置的就是C++集成開發環境。所謂的集成開發環境(Integrated Development Environment,IDE),就是一套用於開發C++程序的軟件集合,一般包括代碼編輯器、編譯器、調試器和圖形用戶界面工具等,是集代碼編寫功能、分析功能、編譯功能、調試功能於一體的開發軟件套裝。一些復雜的新型IDE甚至融合了建模功能、測試功能、項目管理等,幾乎完整覆蓋了軟件開發的整個生命周期。
因為Windows和Linux/UNIX這兩大平台應用領域的不同,導致這兩大平台上的C++開發工具也各不相同。
2.3.1 在Linux/UNIX平台上用GCC開發C++程序
在Linux/UNIX平台上,雖然也有圖形化的集成開發環境可以使用,但為了追求效率, C++程序的開發更多地還是以命令行的形式進行的。比如,Linux/UNIX平台上的C++程序員使用vi編輯源代碼;使用GCC編譯代碼;使用GDB調試代碼等等。從嚴格意義上說,這些工具並不是一個完整的集成開發環境,它們就像“八國聯軍”一樣,共同拼湊成一條Linux/UNIX平台下開發C++程序的工具鏈,但又只是各自負責完成C++程序開發中的某個環節。這其中最重要的,就是GCC所負責的編譯環節。
在前面的例子中,我們用Windows平台上的Visual Studio簡單幾步就完成了一個C++程序的創建,而同樣的工作,要是在Linux/UNIX平台上進行,就沒這么簡單了。實際上,在Linux/UNIX平台上,因為缺少圖形化的集成開發工具的支持,C++程序的創建基本上都是用GCC編譯器,再配合其他編輯調試工具,以手工的方式完成的。
我們通常所說的GCC(GNU Compiler Collection)編譯器,實際上是多個編譯器的統稱。GCC最開始原本只能編譯C語言程序,但是,當C++逐漸流行起來之后,GCC很快地被擴展到可以編譯C++程序。之后,GCC更是被進一步擴展,變得可支持Fortran、Objective-C以及Java等主流開發語言的編譯,成為一個編譯器套件。從GCC的應用來看,它是Linux/UNIX平台上最常用的編譯器。同時,在基於Linux/UNIX平台的嵌入式開發領域,GCC也是用得最普遍的一種編譯器。除此之外,GCC在其他主流的操作系統上都能運行,如Solaris、Windows、Mac OS X操作系統等。正是GCC編譯器應用的廣泛性,使其成為C++編譯器的事實標准。
GCC是一個基於命令行執行的工具,如果我們要使用它編譯一個C++源文件,其命令格式如下:
g++ [編譯選項] 源文件名
其中,g++是GCC的C++編譯命令,其后的編譯選項,是用於控制編譯器的編譯行為的。我們常用的編譯選項有:
-c
此選項表示只編譯,而不鏈接成為可執行文件,編譯器只是將輸入的.cpp源代碼文件編譯生成以.o為后綴的目標文件;
-o 輸出文件名
這個選項用於指定輸出文件的名稱。如果在編譯生成可執行文件時不給出這個選項,GCC 將會生成默認的可執行文件。在Windows平台上,這個文件被命名為a.exe,而在Linux/UNIX平台上,則對應地被命名為a.out;
-g
使用“-g”編譯選項將會產生調試工具(例如,GDB )所必需的符號信息,要想對源代碼進行調試,我們就必須加入這個編譯選項;
-O
這個選項表示編譯器將對程序進行優化編譯、鏈接。采用這個選項,整個源代碼會在編譯、鏈接過程中被優化處理,這樣可以在一定程度上提高可執行文件的執行效率。但是,有所得必有所失,使用優化選項后,編譯、鏈接的速度就會相應地變慢一些;
-I 目錄名
這個選項可以指定GCC的附加頭文件目錄。我們在使用第三方提供的函數庫的時候,常常會用到這個選項,用於將函數庫的include目錄添加為GCC的附加頭文件目錄。
實際上,g++所提供的編譯選項可能有數百個之多,我們只需要了解以上這些常用的編譯選項就可以了。到真正需要其他編譯選項的時候,可以查閱相應的參考手冊。
在了解了GCC的基本使用方法之后,我們也可以在Linux/UNIX平台上新建一個HelloWorld.cpp源文件,並編輯其中的內容跟前面的HelloWorld.cpp文件相同,然后我們就可以用下面的命令,將源代碼文件HelloWorld.cpp利用g++編譯成一個可執行的HelloWorld程序:
g++ -O -o HelloWorld HelloWorld.cpp通過這樣一個簡單的命令,我們就將HelloWorld.cpp這個C++源文件優化編譯並鏈接成了一個可執行文件HelloWorld。現在執行這個可執行文件,就可以在Linux/UNIX平台上用C++程序向C++世界打個招呼了:
./HelloWorld ß啟動可執行文件
Hello World! ß輸出的內容
這里所介紹的GCC只是Linux/UNIX平台上C++程序開發工具箱中最重要的一個工具,它往往還需要配合其他工具(諸如文本編輯器vi、輔助編譯工具make等等)一起使用,才能形成一個完整的工具鏈,才能靈活高效地完成C++程序的開發。
2.3.2 在Windows平台上用Visual C++開發C++程序
與在Linux/UNIX平台上要靠各種工具拼湊成一個“八國聯軍”來開發C++程序相比,Windows平台上的C++程序開發就要簡單多了。在Windows平台上,有眾多的圖形化的集成開發環境,除了我們前面所介紹的最常用的Visual Studio之外,還有支持跨平台的Eclipse CDT和Code::Blocks,更有小巧的Dev-C++等。這些集成開發工具的合理使用,無疑會大大提高我們的開發效率。而在眾多的集成開發環境中,應用最廣泛的還是Visual C++。它是微軟的開發套件Visual Studio中的一個重要組成部分。自1992年微軟推出Visual C++ 1.0以來,經過20多年的不斷發展,Visual C++已經成為了Windows平台上功能最強大、應用最為廣泛的圖形化應用程序開發工具之一。在某些領域,比如操作系統編程、游戲開發、圖形圖像處理、COM編程、網絡編程等,Visual C++具有不可比擬的優勢,成為眾多程序員的首選C++開發工具。
Visual C++雖然非常強大,但就學習和練習C++而言,顯得有點太過復雜,其中的很多功能,我們現在根本還用不上。過多的功能,反而會干擾我們對C++的學習。為此,我們可以選擇它的簡化版本——Visual C++ Express。簡化版本剝離了大多數對初學者而言不太常用的功能(比如對MFC的支持等),但保留了進行C++開發所必須的最基本功能(比如,編譯器、標准庫、代碼編輯器等),完全可以滿足我們現在對IDE的需要。如果我們只是想在Windows平台上學習和練習C++,Visual C++ Express應該是我們的最佳選擇。
2.4 C++世界旅行必備的物品
每個旅行者的背包中都少不了一把瑞士軍刀、一瓶雲南白葯。同樣,每個C++世界的旅行者的背包中也少不了幾款好用的工具軟件。
2.4.1 時間機器——代碼配置管理工具Visual Source Safe
在實際的開發過程中,常常會遇到這樣的情況:為了驗證某個方案是否可行,我們修改了源代碼文件,可是后來卻發現這個方案行不通,要想再回到最初尚未修改的狀態時,卻發現代碼已經被我們改亂了,再也回不去了。這時我們會想,要是有個時間機器,能夠回到過去,取回原來的尚未被修改的代碼該有多好啊。幸運的是,微軟為我們准備了這樣的工具——Visual SourceSafe(簡稱VSS),它就是能讓我們回到過去,取回代碼的時間機器。
本質上講,VSS就是一個源代碼配置管理工具,通過它,可以對現有代碼進行安全的改動。它的基本過程是這樣的:項目中的所有文件都保存在服務器上,在每次修改代碼之前,需要將代碼文件從服務器簽出(check out)到本地進行修改;修改完成之后,再將代碼文件從本地簽入(check in)到服務器保存。每次簽入、簽出都會在服務器上留下相應的時間戳,相當於給當時的代碼拍了一張照片。如果發現某次修改引入了新的錯誤,想要得到修改之前的代碼,那么可以將代碼回滾到修改之前的某個時間點,用當時拍下的照片恢復得到修改之前代碼。這就像擁有了一部時間機器,讓我們可以在代碼的修改歷史中任意穿越,再也不會發生因為錯誤修改想要回到修改之前卻回不去的慘劇。同時,它還可以跟蹤代碼隨着用戶、項目和時間的變化而經歷的更改,方便對代碼進行更新維護。
2.4.2 CodeProject和Stack Overflow
在第1章曾經介紹過,學好C++的唯一途徑就是“多讀多寫多思考”。多讀,就是多閱讀他人的優秀代碼,甚至他人的經驗教訓。在CodeProject網站上,我們可以找到很多優秀的示例代碼;而在Stack Overflow網站上,更多的是他人寶貴的編程經驗。這兩個網站,都應該是我們“多讀”的對象。
1. CodeProject
CodeProject(http://www.codeproject.com)是一個有名的Windows程序設計技術社區,主要的使用者是Windows平台上的程序員。該網站最大的特點就是,其中的技術文章不僅介紹了具體的某項開發技術,同時還提供相應的源代碼下載。讓我們不僅有得看,還有得練。
2. Stack Overflow
Stack Overflow(http://stackoverflow.com)是一個與程序設計相關的IT技術問答網站,除了C++之外,它還覆蓋了C#、Java、PHP等熱門技術領域。用戶可以在網站免費提交自己在開發過程中遇到的問題;瀏覽其他用戶的問題和經過投票排序后的優秀答案;以及搜索自己感興趣的問題等等。Stack Overflow中的問題和答案,都是來自於具體的實踐,往往我們自己在實際編程中遇到的問題,在這里都能找到現成的答案。更重要的,這些問題的答案都是來自於世界各地的技術高超經驗豐富的程序員,並經過用戶的投票排序,所以答案的質量特別高。Stack Overflow現在已經發展成為了全球IT界最受歡迎的技術問答網站。
所以,如果我們在學習中遇到什么難以的問題,可以去這里問問,尋求來自世界各地的答案。即使沒有問題,也可以經常去這里逛逛,看看其他人遇到的問題和相應的解決方法,說不定以后自己也會遇到類似的問題,就知道該如何解決了。
2.4.3 C++詞典——cplusplus.com
學習英語,少不了一本英語詞典。同樣,學習C++語言,也少不了一本C++詞典。
cplusplus.com(http://www.cplusplus.com)就是一本C++詞典。它包含了C++相關的基本信息(C++的概要描述、發展歷史以及FAQ等)、技術文檔(C++部分特性的介紹和教程)、標准庫索引(對標准庫中重要的類、函數、對象等進行了詳盡的描述,並提供了簡短的示例)和論壇等。在學習的過程中,我們常常需要查閱某個庫函數的使用方法,或者是某個類的成員函數等,這些內容幾乎都可以在這里找到最權威的解釋,同時它還配有簡短的例子,讓我們可以對使用方法一目了然。真可以說是一站在手,萬事無憂。
