是否有任何理由在C ++ 03中使用“自动”关键字?

注意,这个问题最初是在2009年发布的,在C ++ 11被批准之前, auto关键字的含义被彻底改变之前。 所提供的答案仅适用于自动types的C ++ 03含义 – 即指定的存储类 – 而不是自动types推导的C ++ 11的含义。 如果您正在寻找有关何时使用C ++ 11 auto ,则此问题与此问题无关。

最长的时间我以为没有理由在C中使用static关键字,因为在块范围之外声明的variables是隐式的全局variables。 然后我发现在块范围内声明一个variables为static会给它一个永久的持续时间,并且在块范围外(在程序范围内)声明它会给它一个文件范围(只能在该编译单元中访问)。

所以这给我留下了只有一个我可能还没有完全理解的关键字: auto关键字。 除了“局部variables”还有其他一些含义吗? 它所做的任何事情都不是在你想要使用它的地方为你做的。 autovariables在程序范围中如何performance? 什么是文件范围内的static autovariables? 这个关键词除了完整性以外还有其他用途吗?

auto是一个存储类说明符, staticregisterextern也是。 你只能在声明中使用这四个中的一个。

局部variables(不带static )具有自动存储持续时间,这意味着它们从其定义的开始直到块的结束。 把汽车放在他们面前是多余的,因为这是默认的。

我不知道有什么理由在C ++中使用它。 在具有隐式int规则的旧C版本中,可以使用它来声明一个variables

 int main(void) { auto i = 1; } 

为了使它有效的语法或从一个赋值expression式消除,如果i在范围内。 但是这在C ++中是无法使用的(你必须指定一个types)。 有趣的是,C ++标准写道:

在块范围内声明没有存储类说明符或声明为函数参数的对象默认具有自动存储持续时间。 [注:因此,自动说明符几乎总是多余的,不经常使用; auto的一个用途是明确区分声明语句和expression式语句(6.8)。 – 注意]

它引用了下面的场景,它可以是一个inttypes的变元,也可以是一个inttypesvariables的声明。 它总是作为一个声明,所以auto不会在这里添加任何有用的东西,而是为人类,而不是。 但是再说一遍,我会说,人类会更好地消除周围多余的括号。

 int(a); 

用C ++ 0x auto到达的新含义,我不鼓励用C ++ 03在代码中的含义来使用它。

在C ++ 11中, auto具有新的含义:它允许您自动推断variables的types。

为什么这个有用? 我们来考虑一个基本的例子:

 std::list<int> a; // fill in a for (auto it = a.begin(); it != a.end(); ++it) { // Do stuff here } 

那里的auto创build一个std::list<int>::iteratortypes的std::list<int>::iterator

这可以使一些严重复杂的代码更容易阅读。

另一个例子:

 int x, y; auto f = [&]{ x += y; }; f(); f(); 

在那里, auto推导出在variables中存储lambdaexpression式所需的types。 维基百科对这个问题有很好的报道。

auto关键字目前没有任何用处。 你是完全正确的,它只是重申了局部variables的默认存储类,真正有用的替代是static

它在C ++ 0x中有一个全新的含义 。 这给你一些想法,它是多么无用!

GCC对嵌套函数有一个特殊的auto使用 – 参见这里 。

如果您在定义之前想要调用嵌套函数,则需要使用auto声明它。

“自动”据说告诉编译器自己决定把variables(内存或寄存器)放在哪里。 它的模拟是“寄存器”,据说它会告诉编译器将其保存在寄存器中。 现代编译器都忽略了,所以你也应该这样做。

我使用这个关键字来显式地logging什么时候对函数至关重要,variables是否放置在堆栈上,用于基于堆栈的处理器。 在从函数(或中断服务程序)返回之前修改堆栈时,可能需要使用此函数。 在这种情况下,我声明:

 auto unsigned int auiStack[1]; //variable must be on stack 

然后我访问variables之外:

 #define OFFSET_TO_RETURN_ADDRESS 8 //depends on compiler operation and current automatics auiStack[OFFSET_TO_RETURN_ADDRESS] = alternate_return_address; 

所以auto关键字有助于logging意图。

根据Stroustrup的说法,在“The C Programming Language”(第4版,涵盖C11)中,使用'auto'有以下主要原因(第2.2.2节)(引用Stroustrup的单词):

1)

这个定义是在一个很大的范围内,我们希望使我们的代码的读者清晰可见的types。

使用'auto'和它必要的初始化器,我们可以一目了然地了解variables的types!

2)

我们希望明确variables的范围或精度(例如,双精度而非浮点)

在我看来,适合这里的一个案例是这样的:

  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)

使用'自动'我们避免冗余和写长types的名字。

想象一下来自模板化迭代器的一些长types名称:

(来自第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; } 

在旧的编译器中,auto是一种声明局部variables的方法。 不能在没有auto关键字的Turbo C之类的旧编译器中声明局部variables。

C ++ 0x中auto关键字的新含义在微软的Stephan T. Lavavej中很好地描述,可以在MSDN的Channel 9站点上find可在STL上自由查看/下载的video讲座。

讲座值得一看,但关于汽车关键词的部分大约是第29分钟(大约)。

除了“局部variables”之外还有其他一些“自动”的含义吗?

不在C ++ 03中。

它所做的任何事情都不是在你想要使用它的地方为你做的。

没有什么,在C + + 03。

自动variables在程序范围中如何performance? 什么是文件范围内的静态自动variables?

不允许在函数/方法体外使用关键字。

这个关键字除了存在的完整性以外还有其他目的吗?

令人惊讶的是,是的。 C ++devise标准包括与C的高度向后兼容性。C有这个关键字,并没有真正的理由禁止它或重新定义其在C ++中的含义。 所以,目的是与C不兼容。

这个关键字在C中有其他目的吗?

最近我才学到了一个:从B.C简化了古代程序的移植,从一个B语言发展而来,它的语法与C.非常类似,但B没有任何types。 在B中声明一个variables的唯一方法是指定它的存储types( autoextern )。 喜欢这个:

汽车我;

这个语法仍然在C中起作用,相当于

int i;

因为在C中,存储类默认为auto ,types默认为int 。 我猜测每一个起源于B并被移植到C的程序当时都是autovariables。

C ++ 03不再允许C风格的隐式int,但它保留了不再有效的auto关键字,因为与隐式int不同,在C的语法中不会引起任何麻烦。