首页 >后端开发 >C++ >为什么在 C 类中定义静态常量整数成员时会出现链接器错误?

为什么在 C 类中定义静态常量整数成员时会出现链接器错误?

Linda Hamilton
Linda Hamilton原创
2024-12-01 13:14:09232浏览

Why Do I Get a Linker Error When Defining Static Const Integer Members in a C   Class?

在类定义中定义静态常量整数成员时出现链接器错误

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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn