gcc - 如何抑制 GCC 编译器警告 : inline variables are only available with -std=c++1z or -std=gnu++1z

标签 gcc g++ c++17 compiler-warnings

我正在使用一个行之有效的全局变量。

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 功能。

关于gcc - 如何抑制 GCC 编译器警告 : inline variables are only available with -std=c++1z or -std=gnu++1z,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60874051/

相关文章:

linux -/usr/bin/ld : attempted static link of dynamic object `/usr/lib64/libm.so'

c++ - 如何在 Cygwin 中禁用由 g++ 生成的扩展 .exe?

c++ - 在模板参数 : Some usage examples and. 中使用 auto .. 如何使其与恒定大小的 C 数组一起使用?

c++ - 为什么段错误是由类变量顺序引起的?

gcc - 有没有一种方法可以在编译代码时让 `gcc' 转储/显示所有正在使用的标志?

c++ - 拉帕克/GNU C++ : Weird bug in LAPACKE_zheevx() function

c++ - 琐碎破坏的意义

c++ - MSVC constexpr 函数 'xyz' 无法生成常量表达式

optimization - 使用Logistic回归模型自动选择gcc编译器优化

c++ - "to_string"是 't a member of "标准”?