C++学习 内存模型和名称空间
1、单独编译
C++鼓励程序员将组件函数放在独立的文件中,如果只修改了一个文件,则可以只重新编译该文件,然后将它与其他文件的编译版本链接。
一般非常有用的组织程序的策略是把程序分成三部分:
- 头文件:包含结构声明和使用这些结构的函数的原型
- 源代码文件:包含与结构有关的函数的代码(函数定义)
- 源代码文件:包含调用与结构相关的函数的代码(主函数)
一个文件(头文件)包含了用户定义类型的定义;另一个文件(函数定义文件/库文件)包含操纵用户定义类型的函数的代码。如果编写另一个程序时,也需要使用这些函数,则只需包含头文件,这两个文件组成了一个软件包,可用于各种程序中。
不要将函数定义或变量声明放在头文件中,这样做对于简单的情况可能是可行的,但通常会引来麻烦。例如,如果在头文件包含一个函数定义,然后在其他两个文件(属于同一个程序)中包含该头文件,则同一个程序中将包含同一个函数的两个定义,除非函数是内联的,否则将出错。下面列出了头文件中常包含的内容。
- 函数原型
- 使用#define定义或const定义的符号常量
- 结构声明
- 模板声明
- 内联函数
头文件管理
在同一个文件中只能将一个头文件包含一次。例如,可能使用包含了另一个头文件的头文件。有一种标准的C/C++技术可以避免多次包含同一个头文件。它是基于预处理器编译指令#ifndef(即if not defined)的。下面的代码片段意味着仅当以前没有使用过预处理器编译指令#define定义名称COORDIN_H_时,才处理#ifndef和#endif之间的语句:
#ifndef COORDIN_H_
...
#endif
通常,使用#define语句来创建符号常量,如下所示:
#define MAXIMUM 4096
但只要将#define用于名称,就足以完成该名称的定义,如下所示:
#ifndef COORDIN_H_
#define COORDIN_H_
#endif
编译器首次遇到该文件时,名称COORDIN_H_没有定义,编译器将查看#ifndef和#endif之间的内容,并读取定义COORDIN_H_的一行
2、存储持续性、作用域和链接性
根据用于分配内存的方法,C++有3种(C++11中是4种)管理数据内存的方式:自动存储、静态存储和动态存储(有时也叫做自由存储空间或堆)。在存在时间的长短方面,以这3种(C++11是4种)方式分配的数据对象各不相同。
自动存储持续性:在函数定义中声明的变量(包括函数参数)
posted on 2019-03-30 11:21 Jiweilearn 阅读(384) 评论(0) 编辑 收藏 举报