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编辑  收藏  举报

导航