自由函数也会对全局名字空间形成威胁,尤其是参数签名中不包含任何用户定义类型时。如果一个自由函数在一个.h文件中定义为带有内部链接或者在一个.c文件中定义为带有外部链接,那么在程序集成过程中自由函数可能会与有相同名称(和签名)的另一个函数定义相冲突。运算符函数是一个例外。
主要设计规则
避免在.h文件的文件作用域内使用自由函数(运算符函数除外);在.c文件中避免使用带有外部链接的自由函数(包括运算符函数)。
幸好,自由函数总能分组到一个只包含静态函数的工具类(结构体)中。由此产生的内聚不一定是最佳的,但是可以减少全局名称冲突的可能性。举个例子:
唯一有冲突危险的符号是类名SysUtil。
不幸的是,自由运算符函数不能嵌套在类中。这不是一个严重的问题,因为自由运算符要求至少有一个参数是用户自定义类型。因此自由运算符冲突的可能性很小,而且这种冲突在实践中通常构不成问题。