msvc内联静态成员变量重新定义

时间:2019-01-19 14:46:52

标签: c++ visual-studio-2017 c++17

我是C ++ 17的新手。考虑以下代码:

// ---------------
// in MyClass.hpp
// ---------------
#pragma once

class MyClass {
public:
    static const int A;
};

inline const int MyClass::A = 100;

// ---------------
// in test.cpp
// ---------------
#include <stdio.h>
#include "MyClass.hpp"

void test() {
    printf("test: %p\n", &MyClass::A);
}

// ---------------
// in main.cpp
// ---------------
#include <stdio.h>
#include "MyClass.hpp"

extern void test();

int main() {
    printf("main: %p\n", &MyClass::A);
    test();
}

使用MinGW-W64 g ++ 8.1.0编译时

g++ -std=c++17 main.cpp test.cpp -o test.exe

输出为

main: 00000000004044B0
test: 00000000004044B0

可以正常工作。

但是,在MSVC 2017中

cl /std:c++17 main.cpp test.cpp

我遇到了编译器错误,并重新定义了“ public:static int const MyClass :: A”。 (很抱歉,编译器输出包含中文字符。不宜直接在此处发布。)

为什么代码可以在g ++下工作,但在MSVC中失败?我做错什么了吗?

1 个答案:

答案 0 :(得分:0)

我可以确认Clang接受了您的代码而没有任何警告。

让我担心的是cppreference显示以下注释:

  

内联说明符不能重新声明已在翻译单元中定义为非内联的函数或变量(自C ++ 17起)。

我无法真正确定C ++标准中该注释的真正原因。但是由于cppreference通常在其警告中是正确的,因此我认为这是MSVC在您的代码上造成阻塞的原因。它可能会期望:

// ---------------
// in MyClass.hpp
// ---------------
#pragma once

class MyClass {
public:
    static const int A = 100;
};

为了避免之前的非内联声明和内联定义。