后来的语言标准中的一些语言特性非常有用,编译器供应商选择将它们向后移植到早期版本。典型的例子是 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/