正所谓“工欲善其事,必先利其器”,而要想做好C++程序设计,自然也离不开几件像样的兵器。下面我们就来看看C++兵器谱上 有哪些神兵利器值得我们学习掌握。排在兵器谱上首要位置的就是C++集成开发环境。所谓的集成开发环境(Integrated Development Environment,IDE),就是一套用于开发C++程序的软件集合,一般包括代码编辑器、编译器、调试器和图形用户界面工具等,是集代码编写功 能、分析功能、编译功能、调试功能于一体的开发软件套装。一些复杂的新型IDE甚至融合了建模功能、测试功能、项目管理等,几乎完整覆盖了软件开发的整个 生命周期。
因为Windows和Linux/UNIX这两大平台应用领域的不同,导致这两大平台上的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++程序的开发。
与在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应该是我们的最佳选择。
每个旅行者的背包中都少不了一把瑞士军刀、一瓶云南白药。同样,每个C++世界的旅行者的背包中也少不了几款好用的工具软件。
在实际的开发过程中,常常会遇到这样的情况:为了验证某个方案是否可行,我们修改了源代码文件,可是后来却发现这个方案行不 通,要想再回到最初尚未修改的状态时,却发现代码已经被我们改乱了,再也回不去了。这时我们会想,要是有个时间机器,能够回到过去,取回原来的尚未被修改 的代码该有多好啊。幸运的是,微软为我们准备了这样的工具——Visual SourceSafe(简称VSS),它就是能让我们回到过去,取回代码的时间机器。
本质上讲,VSS就是一个源代码配置管理工具,通过它,可以对现有代码进行安全的改动。它的基本过程是这样的:项目中的所有文 件都保存在服务器上,在每次修改代码之前,需要将代码文件从服务器签出(check out)到本地进行修改;修改完成之后,再将代码文件从本地签入(check in)到服务器保存。每次签入、签出都会在服务器上留下相应的时间戳,相当于给当时的代码拍了一张照片。如果发现某次修改引入了新的错误,想要得到修改之 前的代码,那么可以将代码回滚到修改之前的某个时间点,用当时拍下的照片恢复得到修改之前代码。这就像拥有了一部时间机器,让我们可以在代码的修改历史中 任意穿越,再也不会发生因为错误修改想要回到修改之前却回不去的惨剧。同时,它还可以跟踪代码随着用户、项目和时间的变化而经历的更改,方便对代码进行更 新维护。
在第1章曾经介绍过,学好C++的唯一途径就是“多读多写多思考”。多读,就是多阅读他人的优秀代码,甚至他人的经验教训。在 CodeProject网站上,我们可以找到很多优秀的示例代码;而在Stack Overflow网站上,更多的是他人宝贵的编程经验。这两个网站,都应该是我们“多读”的对象。
1. CodeProject
CodeProject(CodeProject - For those who code)是一个有名的Windows程序设计技术社 区,主要的使用者是Windows平台上的程序员。该网站最大的特点就是,其中的技术文章不仅介绍了具体的某项开发技术,同时还提供相应的源代码下载。让 我们不仅有得看,还有得练。
2. Stack Overflow
Stack Overflow(Stack Overflow)是一个与程序设计相关的IT技术问答网站,除了C++之外,它还覆盖了C#、 Java、PHP等热门技术领域。用户可以在网站免费提交自己在开发过程中遇到的问题;浏览其他用户的问题和经过投票排序后的优秀答案;以及搜索自己感兴 趣的问题等等。Stack Overflow中的问题和答案,都是来自于具体的实践,往往我们自己在实际编程中遇到的问题,在这里都能找到现成的答案。更重要的,这些问题的答案都是 来自于世界各地的技术高超经验丰富的程序员,并经过用户的投票排序,所以答案的质量特别高。Stack Overflow现在已经发展成为了全球IT界最受欢迎的技术问答网站。
所以,如果我们在学习中遇到什么难以的问题,可以去这里问问,寻求来自世界各地的答案。即使没有问题,也可以经常去这里逛逛,看看其他人遇到的问题和相应的解决方法,说不定以后自己也会遇到类似的问题,就知道该如何解决了。
学习英语,少不了一本英语词典。同样,学习C++语言,也少不了一本C++词典。
http://cplusplus.com(cplusplus.com)就是一本C++词典。它包含了C++相关的 基本信息(C++的概要描述、发展历史以及FAQ等)、技术文档(C++部分特性的介绍和教程)、标准库索引(对标准库中重要的类、函数、对象等进行了详 尽的描述,并提供了简短的示例)和论坛等。在学习的过程中,我们常常需要查阅某个库函数的使用方法,或者是某个类的成员函数等,这些内容几乎都可以在这里 找到最权威的解释,同时它还配有简短的例子,让我们可以对使用方法一目了然。真可以说是一站在手,万事无忧。