我最近遇到了结构/类中静态常量的奇怪未定义符号中描述的问题,我试图通过将定义添加到我的所有静态 const 类成员的相应 .cpp 文件来使我的代码合规,而不仅仅是导致链接器错误的那些。
在多个编译单元中使用常量的情况下,即使定义仅在一个编译单元中,我也会遇到多个定义错误。
将初始化程序移动到定义可以防止错误,但我宁愿不这样做。
值得一提的是,虽然我目前在 Visual Studio 中工作,但此代码需要在多个平台上构建。
我最近遇到了结构/类中静态常量的奇怪未定义符号中描述的问题,我试图通过将定义添加到我的所有静态 const 类成员的相应 .cpp 文件来使我的代码合规,而不仅仅是导致链接器错误的那些。
在多个编译单元中使用常量的情况下,即使定义仅在一个编译单元中,我也会遇到多个定义错误。
将初始化程序移动到定义可以防止错误,但我宁愿不这样做。
值得一提的是,虽然我目前在 Visual Studio 中工作,但此代码需要在多个平台上构建。
静态成员变量在类体中声明并在类体之外定义一次。这样做的一般方法是:
class MyClass
{
static int i;
};
int MyClass::i = 0;
定义是在 C++ 源文件中完成的,而不是在 header(.h) 中。如果这样做,变量将在包含头文件的任何地方定义。看来您正面临同样的问题。
根据http://bytes.com/topic/c/answers/710704-const-static-initialization-visual-studio上的一篇文章,这实际上可能是一个视觉工作室错误,阻止您使用这种形式的初始化。
不幸的是,我认为您可能无法在源文件中进行初始化以保持可移植性。
我创建了一个在 g++ 4.2 中编译和链接良好的简单示例。
如果您启用了语言扩展,Visual Studio 将允许您使用静态 const 对象,而无需在实现文件中定义。不幸的是,当有明确的定义时,它会为正确的 C++ 程序发出错误(如果我没记错的话)。
尝试禁用语言扩展。
我认为如果您希望您的代码在多个平台上工作,您应该将初始化移动到定义中(在 .cpp 文件中)。虽然它可能在一个或多个编译器上工作,但不要依赖它是可移植的。