警告:“auto”类型说明符是 C++11 扩展

问题描述 投票:0回答:2

我有一个非常简单的C++代码语句

auto a = 12;

当我在 Linux 中使用

-std=c++98
选项用 g++ 编译它时,我收到了预期的错误:

error: ‘a’ does not name a type

但是当我在 MacOS 中使用相同选项编译相同代码时,我只收到一条警告,但代码编译得很好:

warning: 'auto' type specifier is a C++11 extension [-Wc++11-extensions]

但是

-std=c++98
的全部意义不就是按照C++ 98标准编译代码吗?所以警告说即使 auto 是一个 C++11 扩展,我也会为你编译它?

是否有任何选项可以强制使用

c++98
(或其他标准)?

g++ --version
打印
Apple clang version 12.0.0 (clang-1200.0.32.29)
顺便说一句,这是另一件奇怪的事情。所以实际上是叮当声。

这就像询问

firefox --version
并得到
chrome 87.0.4280.163

c++ c++11 gcc g++ clang
2个回答
5
投票

在 MacOS 上,您使用的是 clang,而不是 gcc。 (如果我没记错的话,MacOS 分别提供“gcc”和“g++”作为“clang”和“clang++”的符号链接,这样假定 gcc 的脚本就不会中断。)

两个编译器只是以不同的方式处理这种情况。

是的,符合 1998 ISO C 标准的编译器(正如 gcc 和 clang 尝试使用

-std=c++98
所做的那样)必须诊断该行。

就标准而言,非致命警告是有效的诊断。该标准不要求拒绝无效程序(除非它包含

#error
指令)。

如果您想严格执行 C++98 规则并拒绝违反这些规则的代码,请使用

-std=c++98 -pedantic-errors
(与 gcc 或 clang 一起使用)。


1
投票

您可能正在寻找

-pedantic
-pedantic-errors
,引用 man g++:

-迂腐

发出严格的ISO C和ISO C++要求的所有警告;拒绝所有使用禁止扩展名的程序以及其他一些程序 不遵循 ISO C 和 ISO C++ 的程序。对于 ISO C,如下 由使用的任何 -std 选项指定的 ISO C 标准版本。

注意:这并不意味着作为检查严格标准一致性的功能(请参阅手册页中的其余说明)

© www.soinside.com 2019 - 2024. All rights reserved.