使用 C++03:
在 foo.h 中:
class Foo {
public:
// Declare integral static constant with an initializer
static const int some_constant = 42;
};
在 foo.cc 中:
// Define and reserve storage for Foo::some_constant
const int Foo::some_constant;
在 bar.cc 中:
#include <foo.h>
// stuff that uses Foo::some_constant;
长期以来,我一直认为以上是正确的方法。如果类范围的 static 是整数类型并且初始化程序是常量表达式,则允许它具有初始化程序。同样,您必须始终在一个翻译单元中声明静态存储(mod 模板,但让我们忽略它)。
但是,MSVC 2010、2012 和显然 2013 RC 都无法链接同时包含 foo.cc 和 bar.cc 的程序,声称 Foo::some_constant 是多重定义的。
我是否误解了某些事情并做错了,还是 VC 在这里出错了?如果是后者,是否有人参考了错误报告或类似内容?
请不要告诉我将初始化程序移动到 .cpp 文件中。我知道我可以做到这一点,但现在我从语言规则和编译器实现质量的角度对此更感兴趣,而不是变通方法。