首页 > 解决方案 > 确保 g++ 不会使用较新版本的 C++ 中添加的功能来编译程序

问题描述

使用该标志-std=c++14编译也会编译使用在较新版本的 C++ 中实现的功能的程序,并发出如下警告:

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

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

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

标签: c++compiler-errorscompilationg++

解决方案


为了引发编译器错误,专门用于使用仅在 C++ 标准中合法的语言功能,比您选择的标准晚,最有针对性的诊断选项可能是-pedantic-errors记录在案

-迂腐错误

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

[我的重点]

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

如果您编译源代码时std=c++14使用了首先在 C++17 中合法化的构造,那么根据 C++14 标准,该代码格式不正确,需要进行诊断。因此,添加-pedantic-errorsto-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)


推荐阅读