【问题标题】:Sharing static variables across files: namespace vs class跨文件共享静态变量:命名空间与类
【发布时间】:2012-05-19 02:01:02
【问题描述】:

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

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

例如,我这样编码:

//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++;
    }
  }
}

所有这些都产生了代码和代码:

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

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

【问题讨论】:

  • static 可能是 C++ 中最重载的关键字。在这两种情况下,这意味着不同的东西。
  • ...在这种特殊情况下,与您想要的正好相反。

标签: c++ class static namespaces


【解决方案1】:

是的:

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

classstruct 之外,static 具有完全不同的含义。它提供了符号内部链接。因此,如果您声明与static 相同的变量,您实际上会得到所有翻译单元的不同副本,而不是唯一的全局变量。

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

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

【讨论】:

  • @Morpork:注意kode 在这里声明为extern,而不是static。这很重要。
  • @John 是的,当涉及到多个文件时,我感觉无法避免 extern。当然,类中的静态变量除外。感谢大家的快速响应。
  • 从来没想过,只是条件反射。它似乎有些不雅。
猜你喜欢
  • 2012-04-12
  • 2021-11-21
  • 1970-01-01
  • 2012-07-22
  • 1970-01-01
  • 1970-01-01
  • 2011-12-09
  • 1970-01-01
  • 2018-02-28
相关资源
最近更新 更多