C auto关键字在哪里使用?

在我上大学的时候,我读到了关于auto关键字,而且在这段时间里,我实际上已经忘记了它是什么。 它被定义为:

将本地variables定义为具有本地生存期

我从来没有发现它在任何地方被使用,是否真的被使用,如果是,那么它在哪里使用,在哪些情况下?

autostatic的修饰符。 它定义了一个variables的存储类。 但是,由于局部variables的默认值是auto ,所以通常不需要手动指定它。

这个页面在C中列出了不同的存储类

如果你阅读了IAQ (不常见问题)列表,你会知道auto主要用于定义或声明车辆:

 auto my_car; 

一直停放在户外的车辆:

 extern auto my_car; 

对于那些缺乏幽默感的人来说,他们只需要“小姐的事实”:简单的答案是根本没有理由使用auto 。 唯一允许使用auto是一个已经有auto存储类的variables,所以你只是指定了一些会发生的事情。 试图在没有auto存储类的variables上使用auto会导致编译器拒绝你的代码。 我想如果你想获得技术,你的实现不必是一个编译器(但它是),它可以在理论上继续发布诊断(但不会)之后编译代码。

kaz的小增编:

还有:

 static auto my_car; 

这要求根据ISO C进行诊断。这是正确的,因为它声明汽车是坏的。 诊断是免费的,但closures仪表板灯将花费你八十美元。 (如果您从eBay购买您自己的USBencryption狗以进行板载诊断,那么二十或更less)。

前面提到的extern auto my_car也需要一个诊断,因此除了由负责停车执法的城市工作人员以外,从来不会通过编译器运行。

如果你看到很多extern static auto ...在任何代码基地,你在一个不好的邻居; 立即find一个更好的工作,在整个地方转向锈。

auto关键字在C语言中是无用的。 它在那里,因为在C语言之前,存在一个B语言,其中该关键字是声明局部variables所必需的。 (B被开发成NB,成为C)。

这是B的参考手册 。

正如你所看到的,这本手册充斥着使用auto例子。 这是因为没有int关键字。 某些types的关键字需要说“这是一个variables的声明”,该关键字还表示它是本地还是外部( autoextrn )。 如果你不使用这个或那个,你有一个语法错误。 也就是说, x, y; 本身不是一个声明,而是auto x, y; 是。

由于用B编写的代码库必须随着语言的发展而被移植到NB和C中,新版本的语言带来了一些负担,以提高后向兼容性,从而减less了工作量。 在auto的情况下,程序员不必追捕每一个auto发生,并删除它。

从手册中可以明显看出,C中现在已经过时的“implicit int”cruft(能够在前面没有任何int情况下编写main() { ... } )也来自B.这是支持B代码的另一个向后兼容性特性。 函数没有在B中指定的返回types,因为没有types。 一切都是一个词,就像许多汇编语言一样。

注意一个函数可以被声明为extrn putchar ,然后是唯一使得它成为标识符使用的函数:它被用在像putchar(x)这样的函数调用expression式中,这就是告诉编译器把那个无types的字当作一个函数指针。

在C中auto是一个关键字,表示一个variables是块本地的。 由于这是块范围variables的默认值,因此这是不必要的,也很less使用(我不认为我曾经在讨论关键字的文本的例子之外看到过它的用处)。 如果有人能指出一个情况,那就是要使用auto来获得正确的parsing或行为,否则我会感兴趣。

然而,在C ++ 11标准中, auto关键字被“劫持”以支持types推断,其中variables的types可以从其初始化程序的types中获取:

 auto someVariable = 1.5; // someVariable will have type double 

types推断主要是为了支持在模板中声明variables或者从模板函数返回,其中基于模板参数的types(或者在模板被实例化时由编译器推导出)通常会非常痛苦地手动声明。

使用旧的Aztec C编译器,可以使用命令行开关将所有自动variables转换为静态variables(以提高寻址速度)。

但是用auto显式声明的variables在这种情况下保持原样。 (必须recursion函数,否则将无法正常工作!)

auto关键字类似于在Python中包含分号,这是以前的语言( B )所要求的,但开发人员意识到这是多余的,因为大多数东西都是auto

我怀疑是为了帮助从B到C的转换。总之,一个用途是B语言的兼容性。

例如在B和80年代C:

 /* The following function will print a non-negative number, n, to the base b, where 2<=b<=10. This routine uses the fact that in the ASCII character set, the digits 0 to 9 have sequential code values. */ printn(n, b) { extrn putchar; auto a; if (a = n / b) /* assignment, not test for equality */ printn(a, b); /* recursive */ putchar(n % b + '0'); } 

Auto关键字是一个存储类(决定variables的生存期和存储空间的某种技术)的例子。 它有一个行为,由该关键字的帮助生成的variables的寿命(生命周期)只驻留在大括号内

 { auto int x=8; printf("%d",x); // here x is 8 { auto int x=3; printf("%d",x); // here x is 3 } printf("%d",x); // here x is 8 } 

auto是说你不希望它是register 。 然而,由于编译器在没有使用的时候会把register放在register ,所以它常常是没有用的,它认为它是最优的,很less会这么认为,所以经常会错过register是最优的。