C的"自动"关键字的目标

Len*_*ers 18 c c++ c++11

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

小智 44

如果您的代码包含auto关键字,它将会中断.在将近30年的C和C++编程中,我从来没有遇到任何这样的事情.关键字是在第一个C编译器中引入的,用于指定本地函数变量,但编译器几乎立即变得足够聪明,不需要它,并且很少使用它的代码将在今天生存 - 这就是为什么C++ 0x选择回收它而不是引入一个导致可移植性问题的新关键字.

C++ 0X中auto关键字的目的是允许编译器计算变量的类型,这是可能的:

vector <int> v;
auto it = v.begin():
Run Code Online (Sandbox Code Playgroud)

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

  • 这太棒了,我讨厌输入矢量迭代器;) (11认同)
  • @Motti:除非在隐含`int`的情况下使用它,否则它将破坏任何使用旧的含义的'auto`的代码.把'auto`想象成类型; 是`int float`有效吗?那么既不是`auto float`,也不是`auto int`.但是,我在上面说过的例外是在经典C中,`auto i = 0;`创建了一个自动分配的变量,其类型是隐式`int`,名为`i`,初始化为0.这种情况恰好适用于新意义.(`auto`将推断为`int`,因为初始化器的类型0是`int`.) (6认同)

Luc*_*cas 13

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

"auto的旧含义("这是一个局部变量")是多余的和未使用的.一些委员会成员在数百万行代码中搜寻了少量几个用途 - 其中大多数是在测试套件中或似乎是错误".

所以我认为,编译器不会被标准强制实现旧的含义auto.


sbi*_*sbi 9

在C中,auto指定自动存储持续时间(而不是static,extern,register).由于这是默认值,我从未见过auto在任何代码中使用过.不过,我没有做太多的C.


Mot*_*tti 5

这个答案是错误的,请看下面的问题,我在这里留下答案作为参考.


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)
Run Code Online (Sandbox Code Playgroud)

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

  • 令我惊讶的是,考虑到 C++ 中出于 C 兼容性的考虑,他们不允许这样做。;) (2认同)