在类定义中定义静态常量整数成员时出现链接器错误
C 中的类声明允许在班级。但是,用户可能会遇到类似于所提供示例的代码的链接器错误:
class test { public: static const int N = 10; }; int main() { std::cout << test::N << "\n"; std::min(9, test::N); }
虽然编译器接受类定义,但链接器报告对 test::N 的未定义引用。出现这个问题是因为类中的声明不是真正的定义。
在 C 中,静态 const 整型成员必须在类外部的命名空间范围内定义。这是因为根据 C 标准 (9.4.2/4),它们无法在类声明中初始化:
如果静态数据成员是 const 整型或 const 枚举类型,则其在类定义中的声明可以指定常量初始值设定项 [...] 在这种情况下,该成员可以出现在整型常量表达式中。如果在程序中使用该成员,则仍应在命名空间范围内定义,并且命名空间范围定义不应包含初始值设定项。
要解决链接器错误,可以在类外部定义静态 const 成员,通常在相应的源文件中:
const int test::N = 10;
或者,对于 C 11 及更高版本,constexpr 关键字可用于在类中创建真正的定义声明:
class test { public: static constexpr int N = 10; };
以上是为什么在 C 类中定义静态常量整数成员时会出现链接器错误?的详细内容。更多信息请关注PHP中文网其他相关文章!