c++ - 静音 gcc 的 "only available with -std=c++XX or -std=gnu++XX"警告

标签 c++ c++11 g++ c++17

后来的语言标准中的一些语言特性非常有用,编译器供应商选择将它们向后移植到早期版本。典型的例子是 if constexpr

这个简单的程序:

template <typename T>
constexpr int get() {
    if constexpr (sizeof(T) > 10) {
        return 1;
    } else {
        return 0;
    }
}

static_assert(get<int>() == 0, "!");
static_assert(get<char[100]>() == 1, "!");

根据语言规则,技术上需要 C++17,并且在 C++11 中技术上格式不正确...但是 gcc 和 clang 都可以在 -std=c++11 上编译它 无论如何。每个都会发出警告。

Clang 会告诉您该警告是什么,以便您可以禁用它:

foo.cxx:3:8: warning: constexpr if is a C++17 extension [-Wc++17-extensions]
    if constexpr (sizeof(T) > 10) {
       ^
1 warning generated.

使用 -Wno-C++17-extensions 在 clang 上编译不会产生警告。

但是 gcc 实际上并没有说明警告来自哪里:

foo.cxx: In function ‘constexpr int get()’:
foo.cxx:3:8: warning: ‘if constexpr’ only available with -std=c++17 or -std=gnu++17
     if constexpr (sizeof(T) > 10) {
        ^~~~~~~~~

有没有办法关闭这个警告?我知道它“仅在 C++17 上可用”,但有 are reasons还没有完整的 C++17。

最佳答案

正如 Marc 评论的那样,在当前 GCC 版本中停止这些警告的唯一方法是告诉编译器您的代码位于系统头文件中。如果代码位于 GCC 标准之一的 header 中,则自动发生这种情况,包括像 /usr/include 这样的路径,如果代码位于通过 -isystem 找到的 header 中,它会自动发生 选项。您还可以装饰一个 header ,使 GCC 将其视为系统 header ,而不管它所在的目录如何,使用:

#pragma GCC system_header

如果代码不在头文件中,就不能说它在系统头文件中。任何未#include 的源文件都不会被视为系统头文件,无论它位于哪个目录中或您是否使用#pragma。

关于c++ - 静音 gcc 的 "only available with -std=c++XX or -std=gnu++XX"警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55691645/

相关文章:

c++ - atlsafe.h 中奇怪的 C++ 运算符语法

c++ - 可以在 C++ 中使用 "override & final"说明符声明类的相同成员函数吗?

c++ - 为什么这个 C++11 std::regex 示例抛出 regex_error 异常?

c++ - 将容器分成 block ,C++

c++11:它的gc接口(interface)是什么,如何实现?

linux - 如何使g++正确使用我自己的glibc构建的 header ?

c++ - C++中的尾递归

c++ - 编译器是否默认生成构造函数constexpr?

c++ - 为什么将未使用的返回值转换为 void?

c++ - 我应该将类放在 C++ 中的单独文件中吗?