Pub*_*bby 35
虽然7.3.1.1 [namespace.unnamed]表示的是,使用用于声明在命名空间范围变量static关键字的被推荐使用,因为未命名的命名空间提供了更好的选择,这是不太可能的特征将在可预见的未来的任何点被去除,特别是考虑到C兼容性问题.委员会应考虑取消弃用.
我知道的一个问题是匿名命名空间不能专门化命名空间块之外的模板.这就是为什么inline namespace被引入,虽然static也有效.此外,static与宏发挥很好.
Joh*_*itb 29
使用未命名的命名空间,您无法在当前所在的同一命名空间中提供可变的内部链接.static您可以使用.例如,以下使用未命名的命名空间不会给出全局变量内部链接
namespace { int a; }
int a; // oops, no error!
Run Code Online (Sandbox Code Playgroud)
如果第一个a被声明为static,则a在全局范围内声明第二个的尝试将立即出错,因为第一个a已经存在于全局范围.
因此,要实现使身份唯一的工作,未命名的命名空间将实体放入不同的命名空间(除了影响它们的链接).static 只影响链接,保留哪些函数和变量的成员名称不变.
Mar*_*utz 15
用户在战斗中的答案是未命名的命名空间中的名称(匿名命名空间的标准术语)具有外部链接,static在命名空间级别声明的名称具有内部链接.
内部链接有两个优点,其中只有一个未命名的命名空间提供:
它们使翻译单元的名称成为本地名称.我可以fun在不同的翻译单元中以不同的方式定义相同的功能,而不违反单一定义规则.此属性由未命名的命名空间中的名称共享,方法是使用唯一的命名空间名称对其进行装饰.
它们阻止名称进入全局符号表.这绝对是一种优化,但在实践中却是一个重要的优化.未命名的命名空间中的名称不共享此属性.
因此,通常,static用于其转换单元本地命名空间级别函数的程序为链接器生成较少的工作,并且可能比使用未命名的命名空间的等效程序执行得更快.
也就是说,您需要将未命名的命名空间用于要作为模板参数传递的类型,因为模板参数必须具有外部链接.
所以我通常会执行以下操作:将自由函数定义为static,但将类型放入未命名的命名空间中.
| 归档时间: |
|
| 查看次数: |
8686 次 |
| 最近记录: |