C++ primer(九)--命名空间、定位new运算符、存储持续性作用域和链接行、单独编译
一、单独编译
与其将结构声明加入到每一个文件中,不如将其放在头文件中,然后在每一个源代码文件中包含该头文件。也可将函数原型放在头文件中。因此,可以将原来的程序分成三部分:
头文件:包含结构声明和使用这些结构的函数的原型源代码文件:包含于结构相关的函数的代码源代码文件:包含调用与结构相关的函数的代码请不要将函数或变量声明放到头文件中。例如,如果在头文件中包含一个函数定义,然后在其他两个文件(属于同一个程序)中包含该头文件,则同一个程序中将包含同一个函数的两个定义,除非函数是内联的,否则这将出错。头文件中经常包含的内容:
函数原型使用#define或const定义的符号常量结构声明类声明模板声明内联函数结构声明在头文件中可以,因为它们不创建变量,而只是在源代码文件中声明结构变量时,告诉编译器如何创建该结构变量。模板声明不是将被编译的代码,它们指示编译器如何生成与源代码的函数调用相匹配的函数定义。被声明为const的数据和内联函数由特殊的链接属性。
二、存储持续性
关于这个话题,可以参考这篇文章。
单定义规则适用于非内联函数。对于链接性为外部的函数来说(也就是函数没有定义为static),这意味着在多文件程序中,只能有一个文件包含该函数的定义,但是适用该函数的每个文件都应包含其函数的原型。
内联函数不受这些规则的约束,这允许将内联函数的定义放在头文件中。
1)语言链接性
链接程序要求每个不同的函数都有不同的符号名。在C语言中,一个名称只对应一个函数,因此这很容易实现。C语言编译器可能将spiff这样的函数名翻译为_spiff。这种方法被称为C语言链接性。但在C++中,同一个名称可能对应多个函数,必须将这些函数生成不同的符号名称。将spiff(int )转换为_spiff_i,将spiff(double,double)转换为_spiff_d_d。这种为C++语言链接。对于C和C++语言链接之间的不同,解决办法
extern "C" void spiff(int); // 用C语言链接性
三、命名空间
一个名称空间中的名称不会与另外一个名称空间的相同名称发生冲突,同时允许程序的其他部分使用该名称空间中声明的东西。名称空间可以是全局的,也可以位于另一个名称空间中,但不能位于代码块中。在默认情况下,在名称空间中声明的名称的链接性为外部的(除非他引用了常量)
using声明使一个名称可用,而using编译指令使所有的名称都可用。using编译指令由名称空间名和它前面的关键字using namespace组成,它使名称空间中的所有名称都可用。使用using声明比使用using编译指令更安全,这是由于它只导入指定的名称。如果该名称与局部名称发生冲突,编译器将发出指示。