注意这个问题最初发布于2009年,C ++ 11被批准前后的含义之前auto
关键字被彻底地改变。 提供的答案只涉及的C ++ 03含义auto
-正被存储类指定的-而不是的C ++ 11含义auto
-这是自动的类型扣。 如果您正在寻找有关何时使用C ++ 11的建议auto
,这个问题是不相关的这个问题。
时间最长的,我认为没有理由使用static
用C关键字,因为块范围之外声明变量是隐含全球。 然后我发现变量声明为static
块范围内会给它永久持续时间,并宣布它的块范围(在程序作用域)的外部会给它文件范围(只能在编译单元被访问)。
因此,这让我只有一个关键词,我(也许)还没有完全明白: auto
关键字。 有一些其他的意义,它比其他的“局部变量? 凡是它并没有被暗示为你做任何你可能想使用它? 如何在auto
变量在程序范围内的行为? 一个什么static auto
在文件范围变量? 这是否关键字已经不仅仅是现有的完整性其他任何目的?
Answer 1:
auto
是一个存储类说明, static
, register
和extern
了。 您只能使用这四个中的一个声明。
局部变量(无static
)具有自动存储时间,这意味着他们从定义开始生活,直到他们的块结束。 在他们面前把汽车是多余的,因为这是默认反正。
我不知道有什么理由在C ++中使用它。 在具有隐含INT规则旧的C版本,你可以用它来声明一个变量,像:
int main(void) { auto i = 1; }
以使其有效的语法或从赋值表达式的情况下,消除歧义i
是在范围内。 但是,这并不在C ++反正工作(你必须指定类型)。 够好笑的是,C ++标准写道:
而不会在块范围的存储级的说明符声明或声明为函数参数具有默认自动存储持续时间的对象。 [注:因此,自动符几乎总是冗余和不经常使用; 一个汽车使用的是从一个表达式语句(6.8)明确区分的声明语句。 - 注完]
它指的是以下情形,这可能是任一的铸造a
来int
或一个变量的声明a
类型的int
具有围绕冗余括号a
。 它总是采取的是一个宣言,所以auto
就不会在这里添加任何东西很有用,但会为人类,而不是。 但话又说回来,人会离清除周围多余的括号更好的a
,我会说:
int(a);
随着新的含义auto
用的C ++ 0x到达,我不鼓励使用它与C ++ 03的代码的含义。
Answer 2:
在C ++ 11, auto
有了新的意义:它可以让你自动推断变量的类型。
为什么是有史以来最有用? 让我们考虑一个简单的例子:
std::list<int> a;
// fill in a
for (auto it = a.begin(); it != a.end(); ++it) {
// Do stuff here
}
该auto
有创建类型的迭代器std::list<int>::iterator
。
这可以使一些严重的复杂的代码更易于阅读。
另一个例子:
int x, y;
auto f = [&]{ x += y; };
f();
f();
在那里, auto
推断存储在变量中的λ表达所需的类型。 维基百科有良好的学科覆盖面。
Answer 3:
自动关键字目前没有任何目的。 你说得对,它只是重申了默认的存储类别的局部变量,真正有用的其它替换的static
。
它有一个品牌新的内涵 C ++ 0x中。 这就给了你它有多么没用了一些想法!
Answer 4:
GCC具有特殊用途的auto
嵌套功能-看这里 。
如果您有嵌套要其定义之前调用函数,你需要声明它auto
。
Answer 5:
“汽车”理应告诉编译器自行决定在哪里放置变量(存储器或寄存器)。 其模拟为“注册”,这理应告诉编译器要尽量保持它在寄存器中。 现代编译器都忽略了,所以你也应该这么做。
Answer 6:
我使用该关键字时,它为功能的关键,该变量被放置在栈中,用于基于堆栈的处理器来明确地记载。 可以从函数返回(或中断服务例程)之前修改所述堆栈时可能需要该功能。 在这种情况下,我宣布:
auto unsigned int auiStack[1]; //variable must be on stack
然后我访问变量外:
#define OFFSET_TO_RETURN_ADDRESS 8 //depends on compiler operation and current automatics
auiStack[OFFSET_TO_RETURN_ADDRESS] = alternate_return_address;
因此, auto
关键字有助于记录的意图。
Answer 7:
据斯特劳斯在“C程序设计语言”(第4版,覆盖C ++ 11),使用“自动”主要有以下原因(第2.2.2节)(Stroustrup的话被引用):
1)
该定义是在一个大的范围,我们想让类型显然是我们的代码读者可见。
随着“汽车”,其必要的初始化,我们可以知道一目了然变量的类型!
2)
我们要更加明确一些变量的范围或精度(例如,而不是双精度浮点数)
在我看来,适合在此情况下,是这样的:
double square(double d)
{
return d*d;
}
int square(int d)
{
return d*d;
}
auto a1 = square(3);
cout << a1 << endl;
a1 = square(3.3);
cout << a1 << endl;
3)
使用“AUTO”我们避免冗余,写长类型名称。
想象一下,从模板化的迭代器一些长期类型的名称:
(从节6.3.6.1代码)
template<class T> void f1(vector<T>& arg) {
for (typename vector<T>::iterator p = arg.begin(); p != arg.end(); p)
*p = 7;
for (auto p = arg.begin(); p != arg.end(); p)
*p = 7;
}
Answer 8:
在旧的编译器,汽车是在所有声明一个局部变量的一种方式。 没有自动关键字或一些这样您不能声明中旧的编译器类似Turbo C的局部变量。
Answer 9:
C ++ 0x中自动关键字的新含义在自由观看/下载的视频讲座非常漂亮的描述微软的斯蒂芬T. Lavavej对STL在MSDN的第9频道网站上发现这里 。
讲座是值得观看其全部,但有关自动关键字的部分是在约第29分钟标记(大约)。
Answer 10:
有一些其他的意思为“自动”以外的“局部变量?
在C ++中03。
凡是它并没有被暗示为你做任何你可能想使用它?
毫无关系,在C ++ 03。
如何自动变量在程序范围内的行为? 在文件范围的静态自动变量的是什么?
关键字不允许的功能/方法体外。
这是否有关键字的任何目的[在C ++ 03]不仅仅是现有的完整性等?
令人惊讶的,是的。 C ++设计标准包括高程度的向后兼容与C C具有这个关键字,并且没有真正的原因禁止它或重新定义用C其含义++。 因此,其目的是少了一个不兼容的C.
这是否关键字在C不仅仅是现有的完整性其他任何目的?
我最近才知道一个:便于从B.Ç古方案的移植,从它的语法是很相似C.的但是,B没有任何类型的语言称为B进化。 申报在乙可变的唯一方法是,以指定它的存储类型( auto
或extern
)。 像这样:
汽车我;
这句法依然工作在C和相当于
INT I;
因为在C中,存储类默认为auto
,并且类型默认为int
。 我想这是起源于B和被移植到C的每一个节目是从字面上充满了auto
当时的变量。
C ++ 03不再允许空调风格隐式int类型,但它保留了不再视为准确,有用的auto
关键字,因为不像隐式int类型,它不知道引起C的语法任何麻烦
文章来源: Is there any reason to use the 'auto' keyword in C++03?