C auto关键字在哪里使用?
在我上大学的时候,我读到了关于auto
关键字,而且在这段时间里,我实际上已经忘记了它是什么。 它被定义为:
将本地variables定义为具有本地生存期
我从来没有发现它在任何地方被使用,是否真的被使用,如果是,那么它在哪里使用,在哪些情况下?
auto
是static
的修饰符。 它定义了一个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的声明”,该关键字还表示它是本地还是外部( auto
与extrn
)。 如果你不使用这个或那个,你有一个语法错误。 也就是说, 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
是最优的。