代码:
int main(void)
{
auto a=1;
return 0;
}
由MS Visual Studio 2012编译器在文件具有.c分机.我一直认为当你使用.C扩展,编译时应根据C语法,而不是C++.此外,据我所知,没有类型的自动允许在C++中only,因为C++ 11,这意味着类型是从初始化器推导出来的.
这是否意味着我的编译器没有坚持使用C语言,或者代码在C语言中实际上是正确的?
代码:
int main(void)
{
auto a=1;
return 0;
}
由MS Visual Studio 2012编译器在文件具有.c分机.我一直认为当你使用.C扩展,编译时应根据C语法,而不是C++.此外,据我所知,没有类型的自动允许在C++中only,因为C++ 11,这意味着类型是从初始化器推导出来的.
这是否意味着我的编译器没有坚持使用C语言,或者代码在C语言中实际上是正确的?
auto
是一个古老的C关键字,意思是"局部范围".auto a
与auto int a
相同,因为局部作用域是函数中声明的变量的默认值,所以在本例中它与int a
相同.
这个关键字实际上是C的前一个B的遗留,B中没有基类型:一切都是int
,指针指向int
,数组为int
.(*)声明将是auto
或extrn
[sic].C继承了"everything is int
"作为默认规则,因此可以使用
auto a;
extern b;
static c;
ISO Cgo 掉了这一点,但许多编译器仍然接受它以实现向后兼容.如果它看起来很陌生,那么您应该意识到有一个相关的规则在
unsigned d; // actually unsigned int
这在现代代码中仍然很常见.
C++11重用了关键字进行类型推断,几乎没有C++程序员使用该关键字的原始含义.这在很大程度上是安全的,因为C中的"一切都是int
"规则在C++98中已经被删除了;唯一打破的是auto T a
,反正没有人在使用它.(在他的papers on the history of the language篇文章中,Stroustrup对此发表了 comments ,但我现在找不到确切的参考资料.)
(*)B中的字符串处理很有趣:可以使用int
的数组,并在每个成员中打包多个字符.B实际上是BCPL,语法不同.