C 的“auto”关键字的目标

Posted

技术标签:

【中文标题】C 的“auto”关键字的目标【英文标题】:Goal of C's "auto" keyword 【发布时间】:2011-02-20 07:16:39 【问题描述】:

C 中“auto”关键字的目标是什么?对于 C++ 0x,它有了新的含义,但这是否意味着如果我将 C 代码移植到 C++ 0x 编译器,我的代码会中断?

【问题讨论】:

【参考方案1】:

如果您的代码包含auto 关键字,它将中断。在近 30 年的 C 和 C++ 编程中,我从未遇到过这样的情况。在第一个 C 编译器中引入了关键字来指定局部函数变量,但编译器几乎立即变得足够聪明,不需要它,并且使用它的代码很少能在今天继续存在 - 这就是 C++0x 选择回收它而不是引入一个导致可移植性问题的新关键字。

C++0X 中 auto 关键字的目的是让编译器在可能的情况下计算出变量的类型:

vector <int> v;
auto it = v.begin():

编译器可以看到 v.begin() 必须返回 vector&lt;int&gt;::iterator,因此可以创建该类型的变量,从而节省大量的键盘输入或 typedef 创建。

【讨论】:

太棒了,我讨厌输入向量迭代器;) 为什么会破坏包含auto的代码?旧的意思不是还有效吗? @mottii 老实说,我不确定 - 编译器当然可以看到 auto int i; 在新意义上不是自动使用的,但我不确定标准是否需要它们这样做。 @Motti:它将破坏任何在旧含义中使用auto 的代码,除非它被用于隐含int 的情况。将auto 视为类型; int float 有效吗?那么auto floatauto int 都不是。但是,我上面所说的例外是,在经典 C 中,auto i = 0; 创建了一个自动分配的变量,其类型隐式为int,命名为i,初始化为0。这种情况恰好适用于新的含义。 (auto 将被推断为 int,因为初始化器的类型 0 是 int。) @Motti 在 c++0x 模式下 g++ 的价值在于 auto int i 上的 barfs;【参考方案2】:

在 C 中,auto 指定自动存储持续时间(与 staticexternregister 相对)。由于这是默认设置,我从未见过在任何代码中使用auto。不过,我没有做过太多的 C。

【讨论】:

【参考方案3】:

很少使用;这意味着一个局部变量。现代编译器如 VS2010 C++ 给它一个new meaning。

【讨论】:

这个新的含义来自上面提到的C++0x标准【参考方案4】:

这个答案错了,见following question,我把答案留在这里作为参考。


AFAIK C++0x 对 auto 的使用与 C 对 auto 的传统使用并不矛盾。在 C 中auto 与类型一起使用。

auto char c1 = 'a'; // OK, old meaning of auto is still valid
auto c2 = 'b'; // OK, new meaning of auto (deduce c2 is a char)

它可以改变代码含义的唯一地方是当 auto 与 implicit int 规则一起使用时(如果没有指定类型 -> 它是一个 int)在这种情况下,我的示例中的第二行曾经具有 int 类型的 c2,现在它的类型为 char

【讨论】:

不使用 g++,FWIW 编译。 谢谢@Neil,我问了一个新问题来找出谁是对的(我找不到任何 C++0x 草案) 令我惊讶的是,考虑到 C++ 中的所有其他缺陷,为了 C 兼容性,他们不允许这样做。 ;)【参考方案5】:

Bjarne Stroustrup 在他的C++0x FAQ 中提到了auto

"auto 的旧含义("这是一个 局部变量") 是多余的并且 没用过。几名委员会成员 搜索了数百万行 只找到少数用途的代码—— 其中大部分都在测试套件中 或似乎是错误。”

所以我假设,标准不会强制编译器实现auto 的旧含义。

【讨论】:

以上是关于C 的“auto”关键字的目标的主要内容,如果未能解决你的问题,请参考以下文章

喵呜:C++基础系列:auto关键字(C++11)基于范围的for循环(C++11)指针空值nullptr(C++11)

喵呜:C++基础系列:auto关键字(C++11)基于范围的for循环(C++11)指针空值nullptr(C++11)

C++之auto关键字

auto关键字

[ 深度解剖C语言 ] 关键字 ---- auto register

C++11老关键字的新含义(auto, using,extern)