已经定义了静态常量

我有下面的代码(简化),它在gcc中编译得很好,但在VS中给出错误:

// main.cpp
#include "test.h"
int main() {
  return 0;
}

// test.h
#pragma once
class Test {
  static const int TEST = 3;
};

// test.cpp
#include "test.h"
const int Test::TEST;

错误:

main.obj : error LNK2005: "private: static int const Test::TEST" (?TEST@Test@@0HB) already defined in test.obj

是VS错误还是gcc错误地允许我明确定义静态const成员?

更新:在C ++标准(9.4.2.3)中发现:

如果非易失性常量静态数据成员是整型或枚举类型,则其在类定义中的声明可以指定一个括号或等于初始值设定项,其中每个作为赋值表达式的初始化子句都是一个常量表达式(5.20 )。 文字类型的静态数据成员可以使用constexpr说明符在类定义中声明; 如果是这样,它的声明应该指定一个括号或等于初始值设定项,其中每个作为赋值表达式的初始化子句都是一个常量表达式。 [注意:在这两种情况下,成员都可以出现在常量表达式中。 - 结束注释]如果程序中使用了odr-use(3.2),并且名称空间作用域定义不包含初始值设定项,成员仍应在名称空间作用域中定义。

更新#2:发现了一个错误报告,声称它在下一个主要版本中得到修复。


正如你所说这是一个MSVC错误。 该代码在Visual Studio 2015 RC中使用默认项目选项进行编译和完美运行。

在这里输入图像描述

编译器认为“static const int TEST = 3;” 和“const int Test :: TEST;” 是同一个变量的两个不同的定义。 要在您的版本中解决这个问题,您可以尝试在.cpp文件中设置静态变量值:

// test.h
#pragma once
class Test {
  static const int TEST;
};

// test.cpp
#include "test.h"
const int Test::TEST = 3;

通过启用C和C ++的Microsoft扩展,编译器会自动生成超类定义。 有些编译器版本可能是bug,并且即使在您手动定义它时(例如,在编写可移植代码时)也会执行此自动定义。

您可以禁用扩展,或检查_MSC_EXTENSIONS宏。 它是在/ Ze选项设置时定义的。 例如:

#ifndef _MSC_EXTENSIONS
   const int MyClass::MyStaticMember;
#endif
链接地址: http://www.djcxy.com/p/27203.html

上一篇: static const already defined

下一篇: Blue "Halo" on tabs in Safari