在C++中,将一个带有外部链接的定义放置在一个.h文件中往往属于编程错误。如果你这样做了,还把这个头文件包含在不止一个编译单元中,那么把它们链接在一起时将会出现如下的错误信息:
在C++中,在一个头文件的作用域内放置一个带有内部链接的定义,例如静态函数或者静态数据,是合法的。可是这种做法并不理想。这些文件作用域的定义不仅污染了全局名字空间,而且在有静态数据和函数的情况下,它们在每个包含头文件的编译单元中消耗数据空间。甚至数据在文件作用域内声明为const时也可能会引起同样的问题,如果这个常量的地址曾经被占用就更是如此。将(带有内部链接的)文件作用域常量和(带有外部链接的)静态常量类成员进行比较:在整个程序中只能有一个类作用域常量的复制。图1-3显示了一个头文件中应当包含什么,不应当包含什么。
重复的非成员数据定义的冗余不仅影响程序的规模,也影响运行性能,因为它困扰了主机的缓冲机制。
但是,我们偶尔也会有充足的理由在头文件的文件作用域中放置一个用户自定义对象的静态实例。特别是,这样一个对象的构造函数可以用来确保在使用前就初始化一个特定的公共部件(如iostream)。这种解决方案对于中小型系统来说是优美的,但是对于非常大型的系统可能是有问题的。我们将会在7.8.1.3小节继续论述这个问题。