【问题标题】:How to suppress GCC compiler warning: inline variables are only available with -std=c++1z or -std=gnu++1z如何抑制 GCC 编译器警告:内联变量仅适用于 -std=c++1z 或 -std=gnu++1z
【发布时间】:2020-03-26 18:38:32
【问题描述】:

我正在使用一个内联全局变量,它可以很好地实现它。

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

inline MyClass myClass;  // global inline variable

上面的方法很适合我的目的,但是当我的代码使用低于 C++17 的编译器在 gcc 上编译时,我会收到警告。以下是警告

警告:内联变量仅适用于 -std=c++1z 或 -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

【问题讨论】:

  • 为什么不照警告说的做,并使用-std=c++1z 标志?
  • 我的意思是用-std=c++1z 作为gcc 命令的命令行选项来编译它?如果您的构建系统支持,可以将其添加到 CPPFLAGS
  • 看起来我的构建系统不支持。我有点不确定是否可以为这么小的东西更改构建系统。顺便说一句,我正在使用 Cmake。 但是,我的问题更多是关于如何通过在 cpp 源文件中使用某些标志来强制使警告静音(假设我的构建系统支持 C++11)
  • 好的。有没有办法让我的CMakeLists.txt 发出警告?这对我来说是第二个首选选项,但如果根本无法从源代码中消除此警告,那么我将不得不在我的 CMakeLists.txt 中做一些事情。
  • 如果单例是反模式,那么你也不应该使用内联变量;这只是同一事物的不同语法。

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


【解决方案1】:

要了解为什么您不能禁止显示此警告,请查看如果使用不支持内联变量的编译器编译代码会发生什么情况。 (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 (GCC) 7.3.0
  • 非常感谢您解释得这么好。
猜你喜欢
  • 2021-05-11
  • 2019-09-05
  • 1970-01-01
  • 2017-08-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-19
  • 1970-01-01
相关资源
最近更新 更多