将类静态成员定义放入cpp文件--技术限制? < >我在C++中编码时,我最喜欢的一个烦恼是在我的类中声明一些静态变量,然后查看关于未解析静态变量的编译错误(在以前的时候,我总是害怕它到底意味着什么)。

将类静态成员定义放入cpp文件--技术限制? < >我在C++中编码时,我最喜欢的一个烦恼是在我的类中声明一些静态变量,然后查看关于未解析静态变量的编译错误(在以前的时候,我总是害怕它到底意味着什么)。,c++,static,declaration,C++,Static,Declaration,我指的是经典的例子,比如: 测试h class Test { private: static int m_staticVar; int m_var; } Test.cpp int Test::m_staticVar; 在我看来,更让人困惑的是这个定义的语法,你不能在这里使用“static”这个词(因为static在cpp中有不同的含义,叹气),所以你不知道(除了静态成员变量这样工作的知识之外)到底为什么测试类中有一些int是这样定义的,为什么m_var不是这样定义的 据你所知/认为,

我指的是经典的例子,比如:

测试h

class Test
{
private:
  static int m_staticVar;
  int m_var;
}
Test.cpp

int Test::m_staticVar;
在我看来,更让人困惑的是这个定义的语法,你不能在这里使用“static”这个词(因为static在cpp中有不同的含义,叹气),所以你不知道(除了静态成员变量这样工作的知识之外)到底为什么测试类中有一些int是这样定义的,为什么m_var不是这样定义的


据你所知/认为,这是为什么?我能想到的只有一个原因,那就是使链接器的使用变得更容易——也就是说,出于同样的原因,为什么不能使用非整数常量(SomeClass m_var=something)。但我不喜欢仅仅因为编译链的某个部分很难消化而弯曲语言特性的想法…

好吧,这就是它的工作方式。您只在.h文件中声明了静态成员。链接器需要能够在它链接到一起的对象文件中找到该静态成员的一个定义。不能将定义放在.h文件中,这样会生成多个定义


更新:C++17可以用一个。

解决这个问题。首先,从编译器的角度来看,这是完全合理的。为什么不需要冗余关键字

第二,我建议C++中的静态成员。在大家跳之前,我会尽力解释


当然,您不会有任何公共静态数据成员(很少有用)。在任何情况下,大多数类都有自己的CPP文件。如果是这样,出于减少依赖性的原因,静态全局IMO优于私有静态成员。与非静态私有数据不同,静态数据不是接口的一部分,h文件的用户几乎没有理由必须重新编译,或者根本看不到这些成员。

真的不清楚您的问题是什么。您使用的编译器是什么?我一直认为,除非您想将静态变量初始化为特定值,否则不需要在类声明之外列出静态变量。VS2008并没有抱怨你的类定义,但那只是一个编译器,所以它不能证明我是对的……我同意,这样做很烦人。我不认为cpp中的定义特别令人困惑,一旦你被告知如何让链接器满意静态成员。@Praetorian:这不是编译器的事。如果不定义静态,则会导致链接器错误,这也是我在VC++2005中得到的(没有任何更新版本)。@UncleBens,我让VS2008链接器抛出错误;我必须尝试访问静态变量,才能让它抱怨。从技术上讲,只要文件不包含在多个编译单元中,就可以将其放入.h文件中。:)另一方面,可以有多个模板(或内联函数)的定义,并使链接器选择一个……uncBeNeN:C++是不一致的。这是它魅力的一部分。您可能希望匿名名称空间中的
s/static global/variable/
。这些对模板造成的问题较少(它们具有唯一的外部链接;静态全局变量没有外部链接)。