确保g ++不使用新版本C ++中添加的功能来编译程序

问题描述 投票:1回答:1

使用标记-std=c++14进行编译的程序也将使用较新版本的C ++实现的功能,并发出如下警告:

warning: inline variables are only available with -std=c++17 or -std=gnu++17

我不希望g ++在这种情况下编译程序,而且不知道为什么它首先要编译。

[我发现添加标志-Werror会将上述警告转换为错误,以确保程序不会编译,但是我不确定这样做是否建议这样做。

c++ compiler-errors compilation g++
1个回答
0
投票
挑起仅适用于合法语言功能的编译器错误在C ++标准中比您选择的标准晚,这是针对性最好的诊断选项可能是-pedantic-errors,也就是documented

-pedantic-errors

在基本标准(请参阅-Wpedantic)要求诊断时给出错误,>在某些情况下在编译时存在未定义的行为,而在另一些情况下不会阻止根据以下条件进行有效程序的编译:到标准...

[我的重点]

“基本标准”是由-std=...的指定值或默认值命名的C ++标准(或者,如果该标准是像gnu++14这样的GNU方言,那么它就是该方言所基于的C ++标准) 。

[例如,如果使用std=c++14编译源代码,该代码使用首先在C ++ 17中合法化的结构,则该代码按照C ++ 14标准格式不正确,因此需要进行诊断。因此,将-pedantic-errors添加到-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
© www.soinside.com 2019 - 2024. All rights reserved.