如何抑制 GCC 编译器警告:内联变量仅适用于 -std=c++1z 或 -std=gnu++1z

How to suppress GCC compiler warning: inline variables are only available with -std=c++1z or -std=gnu++1z

我正在使用一个内联全局变量,它非常适合它。

class MyClass {
public:
    void Func() {
    }
}

inline MyClass myClass;  // global inline variable

以上对于我的目的来说效果很好,但是当我的代码在 gcc 上使用低于 C++17 的编译器编译时,我收到警告。以下是警告

warning: inline variables are only available with -std=c++1z or -std=gnu++1z

问题:
我怎样才能抑制 gcc 上的警告?

我试图通过使用如下所示的 #pragma 来抑制警告

#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wc++17-extensions"
inline MyClass myClass;
#pragma GCC diagnostic pop

以上 #pragma 技术适用于 clang,但看起来 GCC 不理解 #pragma?我只想暴力压制 GCC 上的警告。我该怎么做?

看起来 gcc 警告选项列表甚至没有提到这个? https://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html

我正在使用 gcc (GCC) 7.3.0

要了解为什么无法抑制此警告,请查看如果使用不支持内联变量的编译器编译代码会发生什么情况。 (Inline variable support started with gcc 7。)旧版本的 gcc 处理您的代码并吐出 error: 'myClass' declared as an 'inline' variable。不是警告,而是无法抑制的错误。急停;未生成目标代码。

较新版本的 gcc 能够提供更多的理解和帮助,但同时它们也有义务与旧编译器保持一定程度的兼容性。这些较新的编译器可以识别此 C++17 功能,并且已确定忽略“inline”会将错误降级为警告(编译不一定需要停止)。此外,该消息还提供了有关如何解决这种情况的信息(假设代码是正确的)。同时,这个警告本质上仍然是旧版本gcc产生的错误,只是进行了改头换面以​​使其更加用户友好。与旧错误一样,它无法被抑制。 您的选择是编写有效的 pre-17 代码或启用 C++17 功能。