9.1单独编译
和c语言一样,c++也允许甚至鼓励程序员将函数组件放在独立的文件中。第一章介绍过,可以单独编译这些文件,然后将他们链接成可执行程序。如果只修改一个文件,则可以只重新编译该文件,然后将它与其它文件的编译版本链接。 因此,可以将原来的程序分成3部分:
1、头文件:包含结构声明和使用这些结构的函数的原型。
2、源代码文件:包含与结构相关的函数得的代码。
3、源代码文件:包含调用与结构相关的函数的代码。
请不要将函数定义或者变量声明放到头文件。这样做对于简单的情况可能是可行的,但通常会引来麻烦。例如,如果头文件包含在一个函数定义,除非函数是内联的,否则这将出错。下面列出头文件中长包含的内容。
1、函数原型。
2、使用#define或const定义的符号常量。
3、结构声明。
4、类声明。
5、模板声明。
6、内联函数。
模板声明不是将被编译的代码,它们指示编译器如何生成与源代码中的函数调用相匹配的函数定义。被声明为const的数据和内联函数有特殊的连接属性
多个库的链接
c++标准允许每个编译器设计人员以他认为合适的方式实现名称修饰(参见第8章),因此由不同编译器创建的二进制模块(对象代码文件)很可能无法正确链接。也就是说,两个编译器将为同一个函数生成不同的修饰名称。名称的不同将使链接器无法将一个编译器生成的函数调用与另一个编译器生成的函数定义匹配。在链接编译模块时,请确保所有对象文件或库都是同一个编译器生成的,如果有源代码,通常可以用自己的编译器重新编译源代码来消除链接错误。
c++使用3种不同的方案来存储数据,这些方案的区别在于数据保留在内存中的时间。
1、自动存储持续性:在函数定义中声明变量(包括函数参数)的存储属性
2、静态存储属性
3、动态存储属性
作用域描述了名称在文件(翻译单元)的多大范围内可见。链接性描述了名称如何在不同单元间共享。链接性为内部的名称只能由一个文件中的函数共享。
自动变量和堆栈
由于自动变量的数目随函数的开始和结束增减,因此程序必须在运行时对自动变量就行管理。常用的方法是流出一段内存,并将其视为堆栈,以管理变量的增减
静态持续变量
和c语言一样,c++也为静态存储持续性变量提供了3种链接性:外部链接性、内部链接性和无链接性。这3种链接性都在整个程序执行期间存在,与自动变量相比,它们的寿命更长。由于静态变量的数目在程序运行期间是不变的,因此程序不需要使用特殊的装置(如堆栈)来管理它们。编译器将分配固定的内存块来存储所有的静态变量
...
int global = 1000; //static duration,external linkage
static int one_file; //static duration,internal linkage
int main()
{
...
}
void func1(int n)
{
static int count = 0;
int llama = 0;
}
所有的静态持续变量都有下面的两个初始化特征:
1、未被初始化的静态变量的所有位都被设置为0。
2、只能使用常量表达式来初始化静态变量。