静态const类成员的多个定义错误
multiple definition error for static const class members
我最近遇到了在结构/类内的静态常量的奇怪未定义符号中描述的问题,我试图通过为所有静态const类成员添加相应的.cpp文件来使我的代码符合规定,而不仅仅是那些导致链接器错误的。
在多个编译单元中使用常量的情况下,我会得到多个定义错误,即使定义仅在一个复杂单元中。
将初始化式移到定义中可以防止错误,但我宁愿不这样做。
为了它的价值,当我目前在Visual Studio中工作时,这段代码需要在几个平台上构建。
静态成员变量在类体中声明,并在类体外部定义。这样做的一般方法是:
class MyClass
{
static int i;
};
int MyClass::i = 0;
定义是在c++源文件中完成的,而不是在头文件(.h)中。如果这样做,该变量将在包含的头文件的任何地方定义。看来你也面临着同样的问题。
如果您启用了语言扩展,Visual Studio将允许您使用静态const对象,而无需在实现文件中定义。不幸的是,对于正确的c++程序,当有显式定义时,它会发出一个错误(如果我没记错的话)。
根据http://bytes.com/topic/c/answers/710704-const-static-initialization-visual-studio上的一个帖子,这实际上可能是visual studio的错误,阻止您使用这种形式的初始化
不幸的是,我认为您可能会在源文件中进行初始化以保持可移植性。
我创建了一个简单的示例,在g++ 4.2中编译和链接得很好。
我认为如果你想让你的代码在多个平台上工作,你应该将初始化移动到定义(在.cpp文件中)。虽然它可能在一个或多个编译器上工作,但不要依赖于它的可移植性。
相关文章:
- 使用命名空间时出现多个定义错误
- 对C宏的未定义引用,但在定义它时会出现重新定义错误
- 尝试调用 .h 文件中定义的变量时出现变量未定义错误
- 在头文件和 cpp 文件中使用一次 #pragma 时出现结构重定义错误
- 链接阶段出现多重定义错误
- 避免模板类中的重定义错误
- 即使我没有包含多个文件,C++中的多个定义错误
- 跨多个类的全局变量而不会出现重定义错误?
- 尝试运行 wasm 函数时出现模块未定义错误
- C++ 预期的左大括号以及重定义错误
- C++:成员的越界声明必须是纯虚函数的定义错误
- c++中数组的未定义错误
- Visual C:模板类中的自定义错误消息
- 为什么C++模板不会导致多个定义错误?
- 只有一个定义/声明时标头声明变量的多堆定义错误
- C++ 在多个其他类中使用单个类 - 编译时出现多个定义错误
- 基类未定义.错误 C2504
- Q 斯坦达项重定义错误
- 可视化C++中的结构定义错误
- VC++ C2011 重定义错误 - 未使用的头文件