c++中的内存模型和名称空间

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 第六版 中文版 ,仅为个人学习笔记

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值