枚举类型、typedef和(默认的)文件作用域常量数据都有内部链接。人们经常在头文件的文件作用域内声明常量、枚举或typedef,这是错误的。
主要设计规则
避免在.h文件的文件作用域内使用枚举、typedef和常量数据。
因为C++完全支持嵌套类型,所以在一个类的作用域内定义的枚举(和typedef声明)不会和全局名字空间中的其他名字冲突。通过选择在一个更有限的作用域内定义一个枚举,可以确保枚举类型的所有枚举成员作用域都类似,并且不会与在作用域之外定义的其他名字冲突。
请看下面这个枚举:
这两个枚举可能不是同一个开发者写的,但是很可能在某一天包含在同一个文件中,导致ORANGE有二义性,无法解析!
如果在单独的类中定义这两个枚举,我们就可以很容易地使用域解析消除二义性问题:
Paint::Orange或Juice::Orange。
基于类似的原因,typedef和常量数据也应该放在头文件的类作用域内。大多数常量数据是整型的,并且嵌套枚举可以很好地在类的作用域中提供整型常量。其他的常量类型(如double、String)必须是类的静态成员,并且在.c文件中初始化:
在大型项目中,除了全局名称冲突外,还有在文件作用域中寻找枚举、typedef和常量等非常现实的问题。在一个类内嵌套一个typedef迫使名称被完全限定(或声明被继承),使得该名称相对容易查找。同样的思路可应用于枚举,我们已经提出了支持在类中嵌套枚举的更有力论据。