静态常量对命名空间成员有什么影响 以前我在MyClass声明中声明了GASTROUNT(并且在源文件中有一个单独的定义,因为C++不支持 const < /Cord>非整数类型的初始化)。但是,我需要从其他文件访问它,而且从逻辑上看,它似乎应该位于名称空间级别

静态常量对命名空间成员有什么影响 以前我在MyClass声明中声明了GASTROUNT(并且在源文件中有一个单独的定义,因为C++不支持 const < /Cord>非整数类型的初始化)。但是,我需要从其他文件访问它,而且从逻辑上看,它似乎应该位于名称空间级别,c++,static,namespaces,constants,C++,Static,Namespaces,Constants,我的问题是,static const在这种情况下有什么影响?显然,const意味着我不能给gascontant分配一个新值,但是名称空间中的静态成员意味着什么呢。这是否类似于文件范围内的静态,即在单元外部无法访问成员?表示: 修改变量时,static关键字指定 变量具有静态持续时间(它是 在程序开始和结束时分配 在程序结束时取消分配)和 将其初始化为0,除非另一个 值被指定。当修改 文件范围内的变量或函数, static关键字指定 变量或函数具有内部 链接(其名称在中不可见) 在它所在的文件之外

我的问题是,
static const
在这种情况下有什么影响?显然,
const
意味着我不能给gascontant分配一个新值,但是名称空间中的静态成员意味着什么呢。这是否类似于文件范围内的静态,即在单元外部无法访问成员?

表示:

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

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


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

< P>在C++中使用<代码>静态<代码>在命名空间范围内被禁止。它通常只在源文件中出现,其作用是使变量成为该源文件的局部变量。也就是说,另一个源文件可以有一个名称完全相同且没有冲突的变量

<>在C++中,建议使用源名称文件本地变量的方法是使用匿名命名空间。 我认为可以公平地说,您的代码中标题中的
static
是不正确的


*.如汤姆在评论中所指出的(和在此),C++委员会推翻了在文件范围内使用“代码>静态<代码> >的决定,因为这个用法将永远是语言的一部分(例如,对于C兼容性)。

< P>如果这是头文件,那么<代码>静态< /代码>在这种情况下没有效果。代码> const 对象在C++中已经默认有内部链接,所以无论你用“代码>静态的< /代码>声明,还是没有<代码>静态< /代码>都没有区别。
我假设您只是将声明从类移动到名称空间中。但是
static
在类声明上下文和命名空间上下文中具有完全不同的含义。在类中,您需要
静态
。在名称空间中,
static
是多余的。

现在我在常量.h中声明/定义了GasConstant,该常量包含在MyClass.h中。听起来它只在包含常量.h或MyClass.h的文件中可见,而在其他不包含常量的文件中不可见。如果另一个文件同时包含这两个文件,会发生什么情况?每个.cpp文件将获得自己的独立副本。很可能不是你想要的…也可能是。对于包含两个的CPP文件,这不应该改变任何东西,但是当然,您需要正确的头保护。所以,我想做的就是简单地将它变成const。这是头文件(h)还是实现文件(.cp)???C++中没有文件范围。如果您在函数和类之外,则只有C++中的命名空间范围。此外,如果您在某些页面上阅读了他们称之为“全局”的内容,那么它们通常指的是全局名称空间和包含的其他名称空间<例如,code>cplusplus.com
因其对“global”一词的不准确使用而闻名。所以,如果有什么东西解释了“全局范围”中“静态”的效果,它们通常意味着它在名称空间范围中的效果。推荐的方法是。。。。你说的“这个”到底是什么意思?我不确定这对我来说是否清楚。在名称空间级别不推荐静态的决定不再是:,这使得这个答案不正确,因为现在使用匿名名称空间或静态是实现相同目标的两种公认且正确的方法。感谢更新,@Tom-我将更新答案。但是,由于类似于文件范围静态操作的静态操作,包含头的单独文件是否会有名称空间成员的单独实例?这当然无关紧要,因为它的常量,也就是说,如果我认为这两个文件可以访问同一个成员,并且其中一个文件的更新会反映在另一个文件中,那么这将是一个问题。只是试着保持笔直。事实上,他不需要在课堂上使用
static
。有了它和没有它,这两种方法对double都是无效的(实际上,这很重要<代码>模板
如果在两个翻译单元中实例化,则会违反ODR。。
// MyClass.h

namespace MyNamespace {

  static const double GasConstant = 1.987;

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