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++部分特性的介绍和教程)、标准库索引(对标准库中重要的类、函数、对象等进行了详尽的描述,并提供了简短的示例)和论坛等。在学习的过程中,我们常常需要查阅某个库函数的使用方法,或者是某个类的成员函数等,这些内容几乎都可以在这里找到最权威的解释,同时它还配有简短的例子,让我们可以对使用方法一目了然。真可以说是一站在手,万事无忧。

你好,C++(6)2.3 C++兵器谱的更多相关文章

  1. 用CIL写程序:你好,沃尔德

    前言: 项目紧赶慢赶总算在年前有了一些成绩,所以沉寂了几周之后,小匹夫也终于有时间写点东西了.以前匹夫写过一篇文章,对CIL做了一个简单地介绍,不过不知道各位看官看的是否过瘾,至少小匹夫觉得很不过瘾. ...

  2. docker4dotnet #1 – 前世今生 & 世界你好

    作为一名.NET Developer,这几年看着docker的流行实在是有些眼馋.可惜的是,Docker是基于Linux环境的,眼瞧着那些 java, python, node.js, go 甚至连p ...

  3. java 写一个"HelloJavaWorld你好世界"输出到操作系统文件Hello.txt文件中

    package com.beiwo.homework; import java.io.File; import java.io.FileOutputStream; import java.io.IOE ...

  4. 你好,欢迎来到我的博客,我是博主royalmice1

    你好,欢迎来到我的博客,我是博主royalmice

  5. 你好,欢迎来到我的博客,我是博主royalmice

    你好,欢迎来到我的博客,我是博主royalmice

  6. 按要求编写Java应用程序。 (1)创建一个叫做People的类: 属性:姓名、年龄、性别、身高 行为:说话、计算加法、改名 编写能为所有属性赋值的构造方法; (2)创建主类: 创建一个对象:名叫“张三”,性别“男”,年龄18岁,身高1.80; 让该对象调用成员方法: 说出“你好!” 计算23+45的值 将名字改为“李四”

    package java1; public class People { public String name; public int age; public String sex; public S ...

  7. 创建一个叫做People的类: 属性:姓名、年龄、性别、身高 行为:说话、计算加法、改名 编写能为所有属性赋值的构造方法; (2)创建主类: 创建一个对象:名叫“张三”,性别“男”,年龄18岁,身高1.80; 让该对象调用成员方法: 说出“你好!” 计算23+45的值 将名字改为“李四”

    package com.chuoji; public class People { private String name; private int age; private String sex; ...

  8. 大数据分析与机器学习领域Python兵器谱

    http://www.thebigdata.cn/JieJueFangAn/13317.html 曾经因为NLTK的缘故开始学习Python,之后渐渐成为我工作中的第一辅助脚本语言,虽然开发语言是C/ ...

  9. (1)创建一个叫做People的类: 属性:姓名、年龄、性别、身高 行为:说话、计算加法、改名 编写能为所有属性赋值的构造方法; (2)创建主类: 创建一个对象:名叫“张三”,性别“男”,年龄18岁,身高1.80; 让该对象调用成员方法: 说出“你好!” 计算23+45的值 将名字改为“李四”

    package a; public class People { private String name,sex; private int age; private double height; pu ...

随机推荐

  1. DeDe缩略图路径的修改

    今天在使用dedecms的时候,遇到的一点小问题,移站的时候缩略图不显示.然后就去百度搜了一下,出来的都是千篇一律. 因为一个网站里面缩略图太多,手动比较慢而已费时间,  俗话说的好“时间就是生命” ...

  2. memcache memcached 区别

    .目前大多数php环境里使用的都是不带d的memcache版本,这个版本出的比较早,是一个原生版本,完全在php框架内开发的.与之对应的带d的memcached是建立在libmemcached的基础上 ...

  3. DbContext的命名空间

    未能找到类型或命名空间名称“DbContext” 解决办法:需要引用命名空间,using System.Data.Entity; 如果还报错的话,则项目需要引用程序集EntityFramework.d ...

  4. Baidu Map Web API 案例

    <html> <head> <meta http-equiv="Content-Type" content="text/html; char ...

  5. activity5 流程 入门

    http://blog.csdn.net/yangyi22/article/details/9225849 谢谢原文作者提供!

  6. 记npm包开发全过程

    概述 为什么开发npm包? 如何开发? 如何写单元测试? package.json 如何发布模块? 如何使用? 为什么开发npm模块? NPM的全称是Node Package Manager,是一个N ...

  7. MyEclipse8.6下的svn插件安装

    myeclipse8.6的svn插件安装 下载site-1.6.18.zip 在myeclipse8.6的MyEclipse8.6的安装目录D:/install/MyEclipse8.6/Genuit ...

  8. 使用GULP打包、压缩与打版本号

    这篇文章讲我整理的一种打包项目的方式,以下是我的依赖清单 "devDependencies": { "gulp": "^3.9.1", &q ...

  9. Oracle_Q&A_03

    1.先导入SQL文件 执行语句查看表信息 select * from student;--学生信息--(stunum,stuname,classid)select * from class;--班级信 ...

  10. Bootstrap--导航元素

    1.标签形导航 2.胶囊型导航: 3.垂直堆叠形导航: 4.导航加下拉菜单: 5.导航列表: 6.可切换的标签导航: