C++多文件程序-处理方法.

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

C++多文件程序

多文件结构和编译预处理命令

一.C++程序的多文件结构

一个程序按结构至少可以划分为三个文件:类的声明文件(*.h文件)、类的实现文件(*.cpp文件)和主函数文件(使用到类的文件,*.cpp文件),如果程序更复杂,我们会为每个类单独建一个声明文件和一个实现文件。这样我们要修改某个类时就直接找到它的文件修改即可,不需要其他的文件改动。

时钟类的例子:

// 文件1:Clock类的声明,可以起名为Clock.h

#include

using namespace std;

class Clock //时钟类声明

{

public: //外部接口

Clock();

void SetTime(int NewH, int NewM, int NewS); //三个形参均具有函数原型作用域

void ShowTime();

~Clock(){ }

private: //私有数据成员

int Hour,Minute,Second;

};

// 文件2:Clock类的实现,可以起名为Clock.cpp #include "Clock.h"

//时钟类成员函数实现

Clock::Clock() //构造函数

{

Hour=0;

Minute=0;

Second=0;

}

void Clock::SetTime(int NewH,int NewM,int NewS) {

Hour=NewH;

Minute=NewM;

Second=NewS;

}

void Clock::ShowTime()

{

cout<

// 文件3:主函数,可以起名为main.cpp

#include "Clock.h"

//声明全局对象g_Clock,具有文件作用域,静态生存期

Clock g_Clock;

int main() //主函数

{

cout<<"文件作用域的时钟类对象:"<

//引用具有文件作用域的对象:

g_Clock.ShowTime();

g_Clock.SetTime(10,20,30);

Clock myClock(g_Clock); //声明具有块作用域的对象myClock,并通过默认拷贝构造函数用g_Clock初始化myClock

cout<<"块作用域的时钟类对象:"<

myClock.ShowTime(); //引用具有块作用域的对象

}

Clock.cpp和main.cpp都使用#include "Clock.h"把类Clock的头文件Clock.h包含进来。#include指令的作用就是将#include后面的文件嵌入到当前源文件该点处,被嵌入的文件可以是.h文件也可以是.cpp文件。如果不包含Clock.h,Clock.cpp和main.cpp就不知道Clock类的声明形式,就无法使用此类,所以所有使用此类的文件都应该包含声明它的头文件。

上面的程序在编译时,由Clock.cpp和Clock.h编译生成Clock.obj,由main.cpp和Clock.h编译生成main.obj,然后就是链接过程,Clock.obj和main.obj链接生成main.exe可执行文件。如果我们只修改了类的实现文件,那么只需重新编译Clock.cpp并链接就可以,别的文件不用管,这样就提高了效率。在Windows系统中的C++程序用工程来管理多文件结构,而Unix系统一般用make工具管理,如果大家从事Unix系统软件开发,就需要自己写make 文件。

在vs2010中如何生成这三个文件呢?我们可以点菜单中Project->Add Class,在弹出的对话框中选择c++ class,然后由弹出个对话框,在class name处填上类名点finish就可以了,这样.h文件和.cpp文件会自动生成,我们也可以点Project->Add New Item,在弹出的对话框中选择Header File(.h)或C++ File(.cpp)来生成.h文件或.cpp文件。

二.编译预处理程序

编译器在编译源程序以前,要由预处理程序对源程序文件进行预处理。预处理程序提供了一些编译预处理指令和预处理操作符。预处理指令都要由“#”开头,每个预处理指令必须单独占一行,而且不能用分号结束,可以出现在程序文件中的任何位置。

1.#include指令

#include指令也叫文件包含指令,用来将另一个源文件的内容嵌入到当前源文件该点处。其实我们一般就用此指令来包含头文件。#include指令有两种写法:#include <文件名>

使用这种写法时,会在C++安装目录的include子目录下寻找<>中标明的文件,通常叫做按标准方式搜索。

#include "文件名"

使用这种写法时,会先在当前目录也就是当前工程的目录中寻找""中标明的文件,若没有找到,则按标准方式搜索。

2.#define和#undef指令

如果你学过C语言,就会知道用#define可以定义符号常量,比如,#define PI 3.14 这条指令定义了一个符号常量PI,它的值是3.14。C++也可以这样定义符号常量,但一般更常用的是在声明时用const关键字修饰。C语言还用#define 定义参数宏,来实现简单的函数运算,比如,#define add(x,y) (x+y) 这条指令说明如果我们用到add(1,2)则预处理后就会用(1+2)代替,C++中一般用内联函数来实现。

#undef用来删除由#define定义的宏,使其不再起作用。

3.条件编译指令

用条件编译指令可以实现某些代码在满足一定条件时才会参与编译,这样我们可以利用条件编译指令将同一个程序在不同的编译条件下生成不同的目标代码。例如,我们可以在调试程序时加入一些调试语句,用条件编译指令控制只有在debug模式下这些调试语句才参与编译,而在release模式下不参与编译。

条件编译指令有5中形式:

a.第一种形式:

#if 常量表达式

程序正文//当“ 常量表达式”非零时本程序段参与编译

#endif

b.第二种形式:

相关文档
最新文档