2011-05-05 69 views
0

我最近跑进Weird undefined symbols of static constants inside a struct/class描述的问题,我试图通过添加定义为相应的.cpp文件我所有的静态常量类成员,使我的代码符合规定,不只是那些导致链接器错误的那些。多个定义错误

在不断的在多个编译单元中使用的情况下,我收到多个定义错误,即使定义仅在compliation单位之一。

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

对于什么是值得的,虽然我目前在Visual Studio中工作,但此代码需要在多个平台上构建。

+6

你能告诉我们你的代码吗? – birryree 2011-05-05 14:59:37

+1

要添加@birryree所说的内容 - 请将您的代码缩小为仍然能够显示您的问题的最小完整示例。在减少代码时,您会发现问题(并且您不需要我们),或者您可以很容易地发现问题(并且您会尽快得到答案)。简短,自包含完整的示例程序,请参阅http://sscce.org。 – 2011-05-05 15:11:41

+0

@birryree和@Rob - 代码与链接的问题和答案中的内容没有显着差异。 – IronMensan 2011-05-05 15:30:50

回答

1

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

尝试禁用语言扩展。

+0

禁用语言扩展不是一种选择,因为Windows7 SDK没有它们就不能编译。然而,http://msdn.microsoft.com/en-us/library/34h23df8(v=VS.80).aspx中描述的selectany选项似乎有诀窍。 – IronMensan 2011-05-05 16:06:04

0

我想,如果你希望你的代码在多个平台上工作,你应该将初始化的定义(在.cpp文件)。虽然它可能在一个或多个编译器上工作,但不要依赖它来进行移植。

3

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

class MyClass 

{ 
    static int i; 

}; 

int MyClass::i = 0; 

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

+0

我试图在问题中明确指出这不是问题,因为包含“相应的.cpp”和“定义仅在其中一个编译单元中” – IronMensan 2011-05-05 15:29:26

1

据对http://bytes.com/topic/c/answers/710704-const-static-initialization-visual-studio的职位之一这实际上可能是一个Visual Studio的错误,导致您无法使用初始化的那种形式。

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

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

+0

是否知道它是否已在更高版本的Visual工作室?我仍然在使用2005. – IronMensan 2011-05-05 15:33:56