静态const类成员的多个定义错误

multiple definition error for static const class members

本文关键字:定义 错误 const 成员 静态      更新时间:2023-10-16

我最近遇到了在结构/类内的静态常量的奇怪未定义符号中描述的问题,我试图通过为所有静态const类成员添加相应的.cpp文件来使我的代码符合规定,而不仅仅是那些导致链接器错误的。

在多个编译单元中使用常量的情况下,我会得到多个定义错误,即使定义仅在一个复杂单元中。

将初始化式移到定义中可以防止错误,但我宁愿不这样做。

为了它的价值,当我目前在Visual Studio中工作时,这段代码需要在几个平台上构建。

静态成员变量在类体中声明,并在类体外部定义。这样做的一般方法是:

class MyClass
{
    static int i;
};
int MyClass::i = 0;

定义是在c++源文件中完成的,而不是在头文件(.h)中。如果这样做,该变量将在包含的头文件的任何地方定义。看来你也面临着同样的问题。

如果您启用了语言扩展,Visual Studio将允许您使用静态const对象,而无需在实现文件中定义。不幸的是,对于正确的c++程序,当有显式定义时,它会发出一个错误(如果我没记错的话)。

根据http://bytes.com/topic/c/answers/710704-const-static-initialization-visual-studio上的一个帖子,这实际上可能是visual studio的错误,阻止您使用这种形式的初始化

不幸的是,我认为您可能会在源文件中进行初始化以保持可移植性。

我创建了一个简单的示例,在g++ 4.2中编译和链接得很好。

我认为如果你想让你的代码在多个平台上工作,你应该将初始化移动到定义(在.cpp文件中)。虽然它可能在一个或多个编译器上工作,但不要依赖于它的可移植性。