我最近遇到了Weird undefined symbols of static constants inside a struct/class中描述的问题,我试图通过为所有静态const类成员的相应.cpp文件添加定义来使我的代码符合规范,而不仅仅是那些导致链接器错误。
在多个编译单元中使用常量的情况下,我得到多个定义错误,即使该定义仅在其中一个补充单元中。
将初始化器移动到定义可以防止错误,但我宁愿不这样做。
对于它的价值,当我目前在Visual Studio中工作时,这段代码需要在几个平台上构建。
答案 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文件中)。虽然它可能在一个或多个编译器上起作用,但不要依赖它是可移植的。