c中“auto”关键字的概念

时间:2011-01-14 07:23:21

标签: c keyword

您能否在C程序中向我提供关键字“auto”的确切概念。

当我读完一本书“Deep C secrets”时,得到了以下引用。

  

显然是auto关键字   无用。它只对a有意义   编译器 - 编写器在一个输入   符号表 - 它说这个存储是   在进入时自动分配   块(与全局静态相反)   分配或动态分配   堆)。汽车无关紧要   其他程序员,因为你得到它   默认值。

7 个答案:

答案 0 :(得分:19)

auto不是数据类型。它是一个存储类说明符,如static。当它用于局部变量时,它基本上与static相反,并指示变量的生命周期等于其范围(例如:当它超出范围时,它会自动销毁)。

您永远不需要指定auto作为您允许使用它的唯一地方,这也是默认值。

答案 1 :(得分:5)

在C89中,您可能会使用隐式int规则。

void f() {
  a = 0; // syntax error
  auto b = 0; // valid: parsed as declaration of b as an int
}

但是,您可以直接写int而不是auto。 C99不再具有隐式int规则。所以我不认为auto有任何真正的目的。它只是“默认的”存储说明符。

答案 2 :(得分:3)

默认情况下,每当您声明变量时,您都会获得auto行为 - int i = 0;但是,您通过明确指定不需要的auto int i = 0来执行此操作。

答案 3 :(得分:1)

如上所述auto是C中函数作用域中变量的默认值。我对该关键字的唯一用法是在宏中。对于执行变量声明的宏,您有时可能希望确保变量未声明static或文件范围。这里auto关键字很方便。

这对于C ++特别有用,你可以滥用构造函数/析构函数机制来进行作用域绑定资源管理。由于auto关键字当前正在将其含义更改为C ++中完全不同的含义,因此不再可能使用此关键字。

答案 4 :(得分:0)

我觉得这句话很值得怀疑。编译器的逻辑级别与编译语言的逻辑级别无关,即使两种语言相同也是如此。可能我在幻想上很穷但我真的无法想象某个关键字是否对编译器有用而对一般程序无用;特别是在“C”中,你不能直接操纵关键字或任何形式的代码而你必须反映数据的所有内容,因为在“C”中,代码​​和数据是两个完全不同的概念。

我的猜测是auto最初是因为它不是可选的而是强制性的,后来当语言发展时,由于现有C代码的向后兼容性原因,它仍然不再存在。

答案 5 :(得分:0)

假设我有一个函数返回某种复杂结构的复杂指针,或者,因为我正在开发一个可以返回不同结构的函数,我希望在C中有:

auto myautoptr = This_Function_that_returns_some_pointer_type();

答案 6 :(得分:0)

我确定您熟悉C中的存储类说明符,它们是“ extern”,“ static”,“ register”和“ auto”。我不确定,但是我认为它取决于编译器。您会看到,关于存储类说明符,有一条规则。我们不能为变量使用多个存储类说明符。这就是为什么静态全局变量不能被外部化的原因。因此,它们仅在文件中已知。转到编译器设置时,可以启用速度优化标记。编译器优化的一种方法是,它在没有存储类说明符的情况下查找变量,然后根据高速缓存的可用性和其他一些因素进行评估,以查看是否应使用寄存器说​​明符来处理该变量。现在,如果我们想优化代码以提高速度,同时又知道程序中的特定变量不是很重要,又不想让编译器甚至将其视为寄存器,该怎么办?我虽然输入了auto,但是由于键入“ register auto int a;”,编译器将无法向变量添加寄存器说明符。或“自动注册int a”;引发使用多个存储类说明符的错误。综上所述,我认为auto可以禁止编译器通过优化将变量视为寄存器。

该理论不适用于GCC编译器,但是我没有尝试过其他编译器。

另一个可能的答案是C于1970年开发,但直到1989年C89出现时才有任何标准。非标准C可能经常使用汽车,但是当C89成为标准C时,也许他们需要保持与非标准C的兼容性。