确保g++;不使用较新版本的C++; 编译使用旗 -STD= C++ 14 编译程序,使用C++中新版本实现的特性,发出如下警告: warning: inline variables are only available with -std=c++17 or -std=gnu++17

确保g++;不使用较新版本的C++; 编译使用旗 -STD= C++ 14 编译程序,使用C++中新版本实现的特性,发出如下警告: warning: inline variables are only available with -std=c++17 or -std=gnu++17,c++,compiler-errors,compilation,g++,C++,Compiler Errors,Compilation,G++,我不希望g++在这种情况下编译程序,也不知道为什么它会这样做 我发现添加标志-Werror会将上述警告转换为错误,确保程序不会编译,但我不确定这是否是建议的方法。专门针对合法语言功能的使用引发编译器错误 在C++标准中,比您选择的标准更晚,是最佳的诊断选择。 可能是-学究式错误,这是 -学究式错误 当基本标准(请参见-Wpedantic)需要诊断时,给出一个错误,,在某些情况下,编译时存在未定义的行为,在某些情况下,不会阻止编译根据标准有效的程序 [我的重点] 这里的“基准”是C++ C++标准

我不希望g++在这种情况下编译程序,也不知道为什么它会这样做


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

专门针对合法语言功能的使用引发编译器错误 在C++标准中,比您选择的标准更晚,是最佳的诊断选择。 可能是
-学究式错误
,这是

-学究式错误

当基本标准(请参见-Wpedantic)需要诊断时,给出一个错误,,在某些情况下,编译时存在未定义的行为,在某些情况下,不会阻止编译根据标准有效的程序

[我的重点]

这里的“基准”是C++ C++标准,它由指定的或默认值<代码> -STD=…/COD>(或者如果一个是GNU方言,如代码> GNU+14 ,那么它是基于该方言的C++标准)。 如果编译源代码时使用了,比如说,

std=c++14
,该代码使用了在c++17中首先合法化的构造,那么根据c++14标准,该代码的格式不正确,需要进行诊断。 因此,在
-std=c++14
中添加
-pedantic errors
将迫使编译器将c++17创新诊断为错误

例如,没有
-学究式错误

$ 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;
      |     ^~~~~~
$ 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;
      |     ^~~~~~
并且带有
-学究式错误

$ 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;
      |     ^~~~~~
$ 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;
      |     ^~~~~~
-迂腐的错误
会使编译器对C++14的一致性比
std-c++14本身,或使用
-Werror
。但我想你不会反对的。你可以做一个不受约束的
选择是否也使用零警告编译(
-Werror

我认为这是一种方法。是的,建议使用
-Werror