跨文件共享静态变量:命名空间与类

Sharing static variables across files: namespace vs class(跨文件共享静态变量:命名空间与类)

本文介绍了跨文件共享静态变量:命名空间与类的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

这里有很多关于静态与全局的问题,但我认为我的问题有点不同.

There are a lot of questions about static vs global here but I think my question is a bit different.

我想知道是否有一种方法可以像类中的静态变量那样在文件之间共享放置在命名空间中的变量.

I want to know if there is a way to share a variable placed in a namespace across files the way static variables in a class can.

例如,我这样编码:

//Foo.h
class Foo
{
  public:
  static int code;
  static int times_two(int in_);
};

namespace bar
{
  static int kode;
}

-

//Foo.cpp
int Foo::code = 0;

int Foo::times_two(int in_)
{
  bar::kode++;
  code++;
  return 2*in_;
}

-

//main.cpp
int main()
{
  cout << "Foo::code = " << Foo::code << endl;

  for(int i=2; i < 6; i++)
  {
    cout << "2 x " << i << " = " << Foo::times_two(i) << endl;
    cout << "Foo::code = " << Foo::code << endl;
    cout << "bar::kode = " << bar::kode << endl;

    if(i == 3)
    {
      bar::kode++;
    }
  }
}

代码和代码的所有结果:

All that yielded this for code and kode:

Foo::code = 1,2,3,4
bar::kode = 0,0,1,1

再一次,有没有办法像类中的静态变量那样在文件之间共享放置在命名空间中的变量?我问的原因是因为我认为我可以通过使用 :: 符号来保护自己免受冲突的全局变量的影响,但我发现我不能.就像任何不尊重自己的程序员一样,我相信我做错了.

Once again, is there a way to share a variable placed in a namespace across files the way static variables in a class can? The reason I ask is because I thought I would be able to shield myself from confliciting global variables by using :: notation, and just found out I could not. And like any self-disrespecting programmer, I believe I am doing it wrong.

推荐答案

是:

//bar.h
namespace bar
{
  extern int kode;
}

classstruct 之外,static 具有完全不同的含义.它给出了一个符号内部链接.因此,如果您将相同的变量声明为 static,您实际上将获得所有翻译单元的不同副本,而不是唯一的全局变量.

Outside of a class or struct, static has a whole different meaning. It gives a symbol internal linkage. So if you declare the same variable as static, you will actually get a different copy for all translation units, not a unique global.

请注意,您需要初始化变量一次:

Note that you'll need to initialize the variable once:

//bar.cpp
namespace bar
{
   int kode = 1337;
}

这篇关于跨文件共享静态变量:命名空间与类的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!

本文标题为:跨文件共享静态变量:命名空间与类