静态const对命名空间成员有什么影响

时间:2010-05-21 16:31:10

标签: c++ static namespaces const

// MyClass.h

namespace MyNamespace {

  static const double GasConstant = 1.987;

  class MyClass
  {
    // constructors, methods, etc.
  };
}

我之前在MyClass声明中声明了GasConstant(并且在源文件中有一个单独的定义,因为C ++不支持非整数类型的const初始化)。然而,我需要从其他文件访问它,从逻辑上看,它似乎应该驻留在命名空间级别。

我的问题是,static const在这种情况下有什么影响?显然const意味着我无法为GasConstant分配新值,但命名空间中的静态成员意味着什么。这类似于文件范围的静态,其中成员不能在单元外访问吗?

3 个答案:

答案 0 :(得分:7)

在C ++中,不推荐在命名空间范围中使用static 。它通常只能在源文件中看到,其效果是使变量本地化为该源文件。也就是说,另一个源文件可以具有完全相同名称且没有冲突的变量。

在C ++中,将变量设置为源文件本地的推荐方法是使用匿名命名空间。

我认为公平地说代码标题中的static是不正确的。

*正如Tom在评论中所指出的那样(以及answer),C ++委员会推翻了在文件范围内弃用static的决定,因为这种用法总是如此部分语言(例如,C兼容性)。

答案 1 :(得分:4)

MSDN说:

  

修改变量时,static关键字指定了   变量有静态持续时间(它是   在程序开始时分配   当程序结束时解除分配)和   除非另一个,否则将其初始化为0   值已指定。修改时   文件范围内的变量或函数,   static关键字指定了   变量或函数具有内部   连接(其名称不可见   在它所在的文件之外   声明)。

请记住,包含头文件意味着将“#include”-directive替换为头文件的实际代码。因此,静态变量只能在包含两个头文件的“.cpp”(已编译)文件中可见。

因此,包含标题的每个“cpp”文件都将拥有自己的静态变量。

答案 2 :(得分:2)

如果这是一个头文件,那么static在这种情况下无效。默认情况下,const个对象在C ++中已经具有内部链接,因此无论是使用static还是static声明它都没有任何区别。

我假设您只是将声明从类中移动到命名空间中。但是static在类声明的上下文和命名空间的上下文中具有完全不同的含义。在课堂上,你需要static。在命名空间中,static是多余的。