【发布时间】:2021-07-11 21:05:06
【问题描述】:
我有一个非常简单的 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)
顺便说一句,这是另一件奇怪的事情。所以实际上是clang。
这就像问firefox --version 并得到chrome 87.0.4280.163
【问题讨论】:
-
编译器是对的。直到 C++11 标准才添加自动类型推导。它在(第一个)C++98 标准发布 13 年后问世。如果您想使用较早的标准,则不能使用后来的标准中引入的东西。为什么要继续使用(现在古老)C++98 标准?你知道我们符合 C++20 标准吗?标准的每次更新都让 C++ 变得更好。
-
@Someprogrammerdude:C98 也有
auto,但它意味着别的东西。如果它是在 C98 模式下编译,它确实应该使用auto的 C98 解释。 -
@Someprogrammerdude 感谢您建议我使用最新的语言标准,但我的问题与您的答案没有任何关系。是的,我知道有一个 C++20 标准并广泛使用它。我也知道 C++23 大概会有什么特性。但这并不意味着人们永远不应询问有关旧标准的问题。
-
@Yksisarvinen:除了 ancient 版本的 C 只会假设随机的
auto变量都是int,并且一些编译器将其带到 C98 中:(跨度> -
@MooingDuck 我相信旧版本的 GCC 和其他一些版本甚至允许这些设置,例如默认将所有变量设为静态并假设 K&R 样式默认为 int。我认为,Wacom C 做到了。