匿名命名空间优于静态?
未命名的命名空间如何优于static
关键字?
你基本上是指C ++标准中的$ 7.3.1.1 / 2部分,
在名称空间范围内声明对象时,不推荐使用static关键字; 无名命名空间提供了一个优越的select。
未命名的命名空间优于静态关键字,主要是因为关键字static
仅适用于variables声明和函数,而不适用于用户定义的types 。
以下代码在C ++中有效
//legal code static int sample_function() { /* function body */ } static int sample_variable;
但是这个代码是无效的:
//illegal code static class sample_class { /* class body */ }; static struct sample_struct { /* struct body */ };
所以解决方法是,unnamed命名空间,就是这个,
//legal code namespace { class sample_class { /* class body */ }; struct sample_struct { /* struct body */ }; }
希望它解释了为什么unnamed-namespace
优于static
。
此外,请注意,在声明名称空间范围内的对象时(根据标准),不推荐使用static关键字。
C ++标准读入7.3.1.1节未命名的命名空间,第2节:
在声明名称空间作用域中的对象时不推荐使用static关键字,unnamed名称空间提供了一个更好的select。
静态只适用于对象,函数和匿名联合的名称,而不是types声明。
有一个有趣的问题与此有关:
假设你使用static
关键字或者未namespace
命名namespace
在模块(翻译单元)内build立一些函数,因为这个函数是由模块内部使用的,并且不能在模块之外访问。 (除了函数外,未namespace
也具有使数据和types定义在内部的优点)。
随着时间的推移,你的模块实现的源文件变大,你想分成几个单独的源文件,这将允许更好的组织代码,更快地find定义,并独立编译。
但是现在你面临一个问题:这些函数对模块来说不再是static
的,因为static
实际上并不是指模块 ,而是指源文件 (翻译单元)。 你被迫使它们是非static
以允许它们从该模块的其他部分(目标文件)被访问。 但这也意味着它们不再是隐藏/私有的:有外部链接,可以从其他模块访问,这不是你的初衷。
未namespace
命名namespace
也不能解决这个问题,因为它也是为特定的源文件(翻译单元)定义的,不能从外部访问。
如果可以指定一些namespace
是private
,也就是说,在其中定义的任何namespace
是由其所属的模块内部使用的,那将是非常好的。 但是当然C ++没有“模块”这样的概念,只有“翻译单元”,它们紧紧地绑定到源文件上。