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

时间:2011-05-05 14:57:58

标签: c++ multiple-definition-error

我最近遇到了Weird undefined symbols of static constants inside a struct/class中描述的问题,我试图通过为所有静态const类成员的相应.cpp文件添加定义来使我的代码符合规范,而不仅仅是那些导致链接器错误。

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

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

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

4 个答案:

答案 0 :(得分:3)

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

class MyClass

{
    static int i;

};

int MyClass::i = 0;

定义在C ++源文件中完成,而不是在头文件(.h)中完成。如果这样做,变量将定义包含头文件的所有位置。看来你正面临同样的问题。

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:1)

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

尝试停用语言扩展程序。

答案 3 :(得分:0)

我认为如果您希望代码在多个平台上运行,则应将初始化移至定义(在.cpp文件中)。虽然它可能在一个或多个编译器上起作用,但不要依赖它是可移植的。