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<int>::iterator
,因此可以创建该类型的变量,从而节省大量的键盘输入或 typedef 创建。
【讨论】:
太棒了,我讨厌输入向量迭代器;) 为什么会破坏包含auto
的代码?旧的意思不是还有效吗?
@mottii 老实说,我不确定 - 编译器当然可以看到 auto int i;
在新意义上不是自动使用的,但我不确定标准是否需要它们这样做。
@Motti:它将破坏任何在旧含义中使用auto
的代码,除非它被用于隐含int
的情况。将auto
视为类型; int float
有效吗?那么auto float
或auto int
都不是。但是,我上面所说的例外是,在经典 C 中,auto i = 0;
创建了一个自动分配的变量,其类型隐式为int
,命名为i
,初始化为0。这种情况恰好适用于新的含义。 (auto
将被推断为 int
,因为初始化器的类型 0 是 int
。)
@Motti 在 c++0x 模式下 g++ 的价值在于 auto int i 上的 barfs;【参考方案2】:
在 C 中,auto
指定自动存储持续时间(与 static
、extern
、register
相对)。由于这是默认设置,我从未见过在任何代码中使用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)