VS2013 - 已定义静态const

riv*_*riv 8 c++ visual-studio visual-studio-2013

我有以下代码(简化),它在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;
Run Code Online (Sandbox Code Playgroud)

错误:

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

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

更新:C++标准(9.4.2.3)中找到:

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

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

Nig*_*een 5

正如你所说,这是一个 MSVC bug。该代码可以在 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;
Run Code Online (Sandbox Code Playgroud)