为什么这是"无效的C++"

NoS*_*tAl 1 c++

我正在阅读关于gtest的介绍并发现这部分令人困惑:

编译器抱怨某些静态const成员变量的"未定义引用",但我确实在类体中定义了它们.怎么了?

如果您的类具有静态数据成员:

// foo.h
class Foo {
  ...
  static const int kBar = 100;
};
Run Code Online (Sandbox Code Playgroud)

您还需要在foo.cc中的类主体之外定义它:

const int Foo::kBar;  // No initializer here.
Run Code Online (Sandbox Code Playgroud)

否则你的代码是无效的C++,并可能以意想不到的方式中断.特别是,在Google Test中使用它比较断言(EXPECT_EQ等)将生成"未定义的引用"链接器错误.

有人可以解释为什么在类中定义静态const而不在类体外定义它是非法的C++?

joh*_*ohn 5

首先,在一个类体内不是一个定义,它是一个声明.声明指定常量的类型和值,该定义保留存储空间.您可能不需要存储空间,例如,如果您仅将该值用作编译时常量.在这种情况下,您的代码是完全合法的C++.但是如果你做的事情就像通过引用传递常量,或者使指针指向常量,那么你也需要存储.在这些情况下,您将收到"未定义的引用"错误.