为什么类中的静态变量会产生链接错误?

时间:2014-03-03 06:19:19

标签: c++

为什么必须将类中的静态变量重新初始化为文件中的全局变量? 否则,它会给出链接错误。它背后的理论是什么?我知道静态变量将在数据段中。

my_class.h

 class my_class
  {
  public:
  static int m_fid;
  void get_fid();
  };

my_class.cpp:

#include <iostream>
using namespace std;
int main()
{
  my_class t;
 /**this gives a linking error */ 
 my_class::m_fid = 0;
 return 0;
}

2 个答案:

答案 0 :(得分:2)

首先静态变量的定义是错误的。 当你这样做时,你应该定义为my_class::m_fid = 0;而不是int my_class::m_fid = 0;,而不会有更多的链接器错误..

按照标准的另一件事......

The definition for a static data member shall appear in a namespace
 scope enclosing the member’s class definition.

答案 1 :(得分:1)

是的,static个变量(无论它们在哪里声明)都会进入数据段。

static表示不同的东西,具体取决于它的使用位置。

  • 在文件或命名空间范围内,表示该变量特定于.cpp文件(翻译单元)。
  • 在本地范围内,它表示该变量特定于该范围,该变量可能特定于翻译单元,或者如果它位于inline函数中,则在翻译单元之间共享。
  • 在类范围内,类中的static成员声明实际上(几乎)与具有extern说明符的类之外的声明相同。

与声明为extern的变量类似,只有在达到定义之前,才会认为静态成员已声明(并且未定义)。

某些static conststatic constexpr成员有一个例外,它们可以在class内初始化,然后立即使用,但受成员地址限制的限制从未使用过。