3.1 开始C++编程

现在我们开始C++编程,争取在天黑之前完成第一个程序HelloWorld。在正式开发之前,不妨先来了解一下C++程序的开发流程以及文件与工程(项目)的概念。

3.1.1 C++程序的开发流程

一般来说,C++编程步骤如下:

Ø        编辑(edit):写出符合语法的代码,用来编辑代码的程序即编辑器(editor)。通常程序的代码又称源代码(source code),或者源文件。源文件名一般以.h.c.cpp为后缀;

Ø        预处理(preprocess):通常C++预处理器会在编译器工作之前完成一些预处理,如完成一些替换等;

Ø        编译(compile):将代码编译成目标码,用来编译代码的程序即编译器(compiler)。如果出现编译错误,程序员就应该返回到编辑代码(修改出错的地方),这个步骤输出的结果一般是.obj文件;

Ø        连接(link):源程序可能包含对其它库函数(如:C++标准库等)的调用,编译产生的目标码并不会包含被调用的函数实体,连接过程完成这些调用实体的填充,并产生可执行程序。在Windows操作系统下,这个步骤产生.exe文件;

Ø        运行(run):运行可执行代码。如果运行产生的结果发生异常,或者与预期结果不符,那么就需要继续修改代码(修改出错的地方)。此时,使用调试器(debugger)进行代码的调试可以更快地发现运行错误。

以上步骤流程描述如图3-1所示。

3-1 编程的步骤

幸运的是,开发者并不总是严格的按照如上步骤一步一步完成程序的开发,实际上在很多IDE(集成开发环境)中程序员只需通过简单的菜单选择或者快捷键的输入即可完成这些操作。如:在Dev-C++中,“编译”即包含“预处理——编译——连接”的过程,在VC 2003中,“预处理——编译——连接”的过程则被称作“build”。“build”通常被译成“生成”,又译作“联编”(由于“生成”很容易给初学者带来概念上的混淆,本书将采用“联编”这个说法)。

即使是最牛的程序员,也很难一次性编写出完全正确的程序。从3-1可以看出,联编、运行的时候,可能会报告代码中的“联编错误”或者“运行错误”。这个时候该怎么办?程序的功能与我们的期望存在了差距,很显然,这个时候就需要修改、调整源程序,让它变得正确起来。

3.1.2 文件与工程(项目)

开始编写某个程序的时候,大多数情况它就是一个单独的文件,如广为流传的HelloWorld.cpp程序:

 

 

Code:
  1. #include <iostream>   
  2. using namespace std;   
  3.   
  4. int main()   
  5. {   
  6.     cout << "hello, world!" << endl; //输出hello, world  
  7.     return 0;   
  8. }   

HelloWorld.cpp用以向屏幕输出一串信息“hello, world!”,文件后缀“.cpp”表明它是一个C++源文件(“cpp”是“c plus plus”的缩写)。我们可以通过某个编辑器编辑保存这个cpp文件,由于这个一根筋的程序并不牵涉到其他文件。它的联编过程可能就相对简单一些,如图3-2所示。

3-2 单一文件的联编

有的时候,单单采用一个文件并不能解决问题。假设现在编写一个根据用户输入的半径计算圆周长的程序a.cpp,如:

Code:
  1. #include <iostream>   
  2. using namespace std;    
  3.   
  4. double getCircumference(double radius);   
  5.   
  6. int main()   
  7. {   
  8.     double radius;   
  9.     cin >> radius; //输入半径   
  10.   
  11.   double c = getCircumference(radius);   
  12.     cout << "周长: " << c << endl;   
  13.   
  14.     return 0;   
  15. }   
  16.   

getCircumference()是一个函数,它用以计算指定半径的圆的周长。这个计算模块很有可能存在另外一个相对独立的文件中,如b.cpp

Code:
  1. double getCircumference(double radius)   
  2. {   
  3.     double c;   
  4.     c = 2 * 3.14 * radius;   
  5.     return c;   
  6. }   

这样一来,完整的程序HelloWorld实际上包含2个源文件:a.cppb.cppa.cppb.cpp将单独参与编译器的编译,并最后被连接器连接起来,如图3-3所示。

3-3 多个文件的联编

实际上,一般b.cpp的编写者会同时提供一个文件b.h

double getCircumference(double radius);

文件后缀“.h”表明b.h是一个头文件(“h”是“header”的缩写)。如上b.h声明了b.cpp中的函数getCircumference(),当a.cpp使用指令“#include”包含了头文件b.h之后,编译器不需要b.cpp就能认识getCircumference()了:

Code:
  1. #include <iostream>  
  2. #include "b.h"   
  3. using namespace std;   
  4.   
  5. int main()   
  6. {   
  7.     double radius;   
  8.     cin >> radius; //输入半径   
  9.   
  10.   double c = getCircumference(radius);   
  11.     cout << "周长: " << c << endl;   
  12.   
  13.     return 0;   
  14. }   
  15.   

这样一来,HelloWorld程序至少包含了2cpp文件和1个头文件,某些高级的程序可能还需要包含一些库文件、资源文件等内容。一般开发环境将这样的源文件(包括实现文件和头文件)、库文件、资源文件的集合以及其他的配置信息保存并管理起来,称作“project”,中文译作“工程”或者“项目”,如图3-4所示。

3-4 C++工程的含义

posted on 2009-07-01 14:35  白乔  阅读(250)  评论(0编辑  收藏  举报

导航