为什么必须将类中的静态变量重新初始化为文件中的全局变量? 否则,它会给出链接错误。它背后的理论是什么?我知道静态变量将在数据段中。
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;
}
答案 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 const
和static constexpr
成员有一个例外,它们可以在class
内初始化,然后立即使用,但受成员地址限制的限制从未使用过。