c++ - 确保 g++ 不会使用较新版本的 C++ 中添加的功能来编译程序
问题描述
使用该标志-std=c++14
编译也会编译使用在较新版本的 C++ 中实现的功能的程序,并发出如下警告:
warning: inline variables are only available with -std=c++17 or -std=gnu++17
我不希望 g++ 在这种情况下编译程序,并且不知道为什么它首先会这样做。
我发现添加标志-Werror
会将上述警告转换为错误,确保程序无法编译,但我不确定这是否是推荐的方法。
解决方案
为了引发编译器错误,专门用于使用仅在 C++ 标准中合法的语言功能,比您选择的标准晚,最有针对性的诊断选项可能是-pedantic-errors
,记录在案
-迂腐错误
每当基本标准(请参阅 -Wpedantic)需要诊断时给出错误,在某些情况下,在编译时存在未定义的行为,在某些其他情况下,不会阻止编译根据标准有效的程序......
[我的重点]
这里的“基本标准”是由指定值或默认值命名的 C++ 标准-std=...
(或者如果该标准是 GNU 方言gnu++14
,那么它就是该方言所基于的 C++ 标准)。
如果您编译源代码时std=c++14
使用了首先在 C++17 中合法化的构造,那么根据 C++14 标准,该代码格式不正确,需要进行诊断。因此,添加-pedantic-errors
to-std=c++14
将迫使编译器将 C++17 创新诊断为错误。
例如,没有-pedantic-errors
$ cat foo.cpp
struct foo
{
inline static const int value = 42;
};
$ g++ -std=c++14 -Wall -Wextra -pedantic -c foo.cpp
foo.cpp:3:5: warning: inline variables are only available with ‘-std=c++17’ or ‘-std=gnu++17’
3 | inline static const int value = 42;
| ^~~~~~
与-pedantic-errors
$ g++ -std=c++14 -Wall -Wextra -pedantic-errors -c foo.cpp
foo.cpp:3:5: error: inline variables are only available with ‘-std=c++17’ or ‘-std=gnu++17’
3 | inline static const int value = 42;
| ^~~~~~
-pedantic-errors
将使编译器对 C++14 的一致性比单独
std-c++14
使用或使用-Werror
. 但我想你不会反对。并且您可以自由选择是否还练习零警告编译的一揽子原则 ( -Werror
)
推荐阅读
- python - 带有 jupyter 的 Pandas:删除 .csv 文件列中引号前的空格
- flutter - 致命错误:找不到模块“firebase_auth”
- pine-script - 如何确保我的交易有 2 种不同的止损(松树脚本)?
- c# - 为什么 ECDiffieHellmanP256 与 ECDsaCng.SignData() 一起使用?
- c# - Socket Server 不断添加更多的值来之前接收的值
- django - 如何使用 Django 频道将组限制为一定数量的用户?
- c - 创建一个文件并使用数据成员写入结构,创建的文件为空
- date - 将数周的天数转换为数月
- coinbase-api - Coinbase PHP API 以英镑为单位的历史价格
- bash - 自动完成 - 和 - 参数