笔记 这个问题最初发布于 2009 年,在 C++11 被批准之前,在 auto 关键字发生了很大的变化。提供的答案涉及 仅有的 C++03 的含义 auto -- 这是指定的存储类 -- 而不是 C++11 的含义 auto ——这是自动类型推导。如果您正在寻找有关何时使用 C++11 的建议 auto, ,这个问题与那个问题无关。

在很长一段时间里,我认为没有理由使用 static C 中的关键字,因为在块作用域之外声明的变量是隐式全局的。然后我发现将变量声明为 static 在块作用域内将给它永久的持续时间,并且在块作用域之外(在程序作用域中)声明它将给它文件作用域(只能在该编译单元中访问)。

因此,这只剩下一个我(可能)尚未完全理解的关键字:这 auto 关键词。除了“本地变量”以外,还有其他含义吗?无论您想在任何地方使用它,它都不会为您带来隐含的做法吗?如何 auto 变量在程序范围内的行为?什么是一个 static auto 文件范围内的变量?该关键字是否还有其他目的 只是为了完整性而存在?

有帮助吗?

解决方案

auto是一个存储类说明,staticregisterextern太。您只能使用这四个中的一个声明。

局部变量(不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的代码的含义。

其他提示

在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推断存储在变量中的λ表达所需的类型。 维基百科有关于这个问题的好覆盖。

自动关键字的时刻没有目的。你说得对,它只是重申了默认的存储类别的局部变量,真正有用的其它替换static

它有C ++ 0x中一个品牌新的含义。这就给了你的一些想法是多么没用了!

“自动”假想告诉编译器自行决定在哪里放置变量(存储器或寄存器)。其模拟为“注册”,这理应告诉编译器要尽量保持它在寄存器中。现代编译器都忽略了,所以你也应该这么做。

我使用该关键字时,它为功能的关键,该变量被放置在栈中,用于基于堆栈的处理器来明确地记载。可以从函数返回(或中断服务例程)之前修改所述堆栈时可能需要该功能。 在这种情况下我声明:

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关键字有助于记录的意图。

据Stroustrup的,在“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)

  

使用“自动”我们避免冗余,写长类型名称。

从模板化迭代想象一些长类型名称:

(从节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;
}

在旧的编译器,汽车是在所有声明一个局部变量的一种方式。没有自动关键字或一些这样的。

您不能声明在旧的编译器类似Turbo C的局部变量

有一些其他的意思为 '自动' 以外的 '局部变量?'

不是在C ++ 03

任何它并没有被暗示为你做任何你可能想使用它?

毫无关系,在C ++ 03

如何自动变量在程序范围内的行为?在文件范围的静态自动变量怎么样?

关键字不允许的功能/方法体外。

这是否关键字具有任何目的[在C ++ 03]不仅仅是现有的完整性?其他

出人意料地,肯定的。 C ++设计标准包括高程度的向后兼容与C C具有这个关键字,并且没有真正的原因禁止它或重新定义用C其含义++。所以,其目的是少一个不兼容℃。

这是否关键字在C不仅仅是现有的完整性?其他任何目的

我最近才知道一个:便于从B.Ç古方案的移植,从它的语法是很相似C.的但是,B没有任何类型的语言称为B进化。申报在乙可变的唯一方法是,以指定它的存储类型(autoextern)。像这样:

  

自动I;

此语法仍然工作在C和相当于

  

INT I;

,因为在C,存储类默认为auto,和类型默认为int。我想,起源于B和被移植至C的每一个程序在当时是从字面上充满auto变量。

C ++ 03不再允许空调风格隐式int类型,但它保留了无较准确-有用auto关键字,因为不像隐式int类型,它不知道引起C的语法任何麻烦

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top