为什么类中的静态变量会给出链接错误

why static variable in a class gives a linking error?

本文关键字:链接 错误 变量 静态 为什么      更新时间:2023-10-16

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

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

首先,静态变量的定义是错误的。而不是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.

是的,static变量(无论在哪里声明)都会进入数据细分受众群。

不过,static的含义不同,具体取决于它的使用位置。

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

像声明extern变量一样,静态成员只被认为是声明的(而不是定义的),直到达到定义。

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