c++为内存中存储数据方面提供了多种选择。通常大型程序都由多个源代码文件组成,这些文件可能共享一些数据。这样的程序就涉及到程序文件的单独编译。
1.单独编译
c++鼓励程序员将组件函数放在单独的文件中。可以单独的编译这些文件,然后将他们链接成可执行的程序。
将结构声明放在头文件中,然后在每一个源代码文件中包含该头文件。
可以将程序分为三部分:
1、头文件:包含结构声明和使用这些结构的函数的原型 |
2、 源代码文件:包含与结构有关的函数的代码 |
3、源代码文件:包含调用与结构相关的函数的代码 |
头文件中常包含的内容:
1、函数原型 |
2、使用#define或const定义的符号常量 |
3、结构声明 |
4、类声明 |
5、模板声明 |
6、内联函数 |
包含自定义头文件时,使用"coordin.h"而不是<coordin.h>。如果文件名包含在尖括号中,则c++编译器将在存储标准头文件的主机系统的文件中查找;单如果文件名包含在双引号中,则编译器将首先查找当前的工作目录或源代码目录。如果没有在哪里找到头文件,则将在标准位置查找。
实例:将直角坐标系的数据转换成极坐标数据文件输出,分为三个文件,一个主函数文件,一个头文件(包含所需的结构的定义以及函数的原型),一个函数定义的文件。
主函数文件:
//文件名:main.cpp
#include<iostream>
#include"coordin.h"//本文件中的结构和函数在coordin.h中定义和使用原型
using namespace std;//名称空间
int main()
{
rect rplace;//直角坐标结构变量x and y
polar pplace;//极坐标结构变量
cout << "Enter the x and y values";
while(cin >> rplace.x >> rplace.y)//输入值
{
pplace = rect_to_polar(rplace);
show_polar(pplace);
cout << "next two number (q to quit):";
}
cout << "BYE!\n";
return 0;
}
头文件:
//文件名:coordin.h
#ifndef COORDIN_H_
#define COORDIN_H_
struct polar //极坐标数据
{
double distance;
double angle;
};
struct rect //直角坐标数据
{
double x;
double y;
};
//函数原型
polar rect_to_polar(rect xypos);
void show_polar(polar dapos);
#endif
函数定义文件:
//文件名为:函数定义.cpp
#include<iostream>
#include<cmath>
#include"coordin.h"//结构体定义,函数模板
//转换直角坐标系到极坐标系
polar rect_to_polar(rect xypos)//接收直角坐标数据,输出极坐标数据
{
using namespace std;//标准名称空间
polar answer;//定义极坐标结果结构变量
answer.distance = sqrt(xypos.x*xypos.x+xypos.y*xypos.y);//开平方
answer.angle = atan2(xypos.y,xypos.x);//反正切函数
return answer;//返回极坐标形式的数据,以结构形式
}
//
void show_polar (polar dapos)//显示转换结果,以极坐标形式
{
using namespace std;
const double Red_to_deg = 57.29577951;//角度转换常数
cout << "distance = " << dapos.distance;
cout << ", angle = " << dapos.angle*Red_to_deg;
cout << "degrees\n";
}
头文件中#ifndef的使用
当程序中含有多个类时,涉及到类的嵌套使用,大类(maze)嵌套小类(node),结果是,大类中多次使用了定义一个小类。C++中不允许多次定义一个类,即使重复的是完全相同的类。故C++提供了一种方式标记一个代码小节,指出“如果以前包含了这一节的内容,就不要再次包含。”如下
#ifndef MYADT_H //如果还没定义myADT,
#define MYADT_H //就去定义
<类的定义>
#endif //结束
在头文件中使用#ifndef, #define,#endif的原因:
因为我们在不知情的原因下,很可能将头文件包含多次。例如,可能使用包含了另外一个头文件的文件。有一种标准的c/c++技术可以避免多次包含同一个文件。它是基于预处理器编译指令#ifndef(即if not define)的,下面的代码片段意味着仅当前没有使用预处理器编译指令#define定义名称COORDIN_H_时,才处理#ifndef和#endif之间的语句:
#ifndef COORDIN_H_
...
#endif
编译器首次遇到该文件时,名称COORDIN_H_没有定义(这个名称是根据头文件的名字取得,并加上一些下划线,使其在其他地方不大可能被定义),在这种情况下,编译器将查看#ifndef和#endif之间的内容(这正是我们所希望看到的),如果在同一个文件中遇到其他包含coordin.h的内容,编译器就知道COORDIN_H_已经被定义了,从而跳到#endif后面的一行上。
c++的多文件组织结构实例:
下例中,分为三个文件,一个头文件,两个源代码文件:
结构如下:
大部分来自c++ primer plus 第六版 中文版 ,仅为个人学习笔记