C auto关键字在哪里使用?

Vij*_*jay 93 c

在我的大学时代,我读到了auto关键词,随着时间的推移,我实际上忘记了它是什么.它被定义为:

将局部变量定义为具有本地生命周期

我从来没有发现它在任何地方都被使用过,它是否真的被使用过,如果是的话那么它在哪里被使用?在哪些情况下?

Jer*_*fin 120

如果您阅读了IAQ(不常见问题)列表,您就会知道auto主要用于定义或声明车辆:

auto my_car;
Run Code Online (Sandbox Code Playgroud)

一直停在户外的车辆:

extern auto my_car;
Run Code Online (Sandbox Code Playgroud)

对于那些缺乏幽默感并想要"只是事实女士"的人:简短的回答是根本没有任何理由可以使用auto.您唯一允许使用的auto是使用已具有auto存储类的变量,因此您只需指定可能发生的事情.尝试auto在任何没有auto存储类的变量上使用将导致编译器拒绝您的代码.我想如果你想获得技术,你的实现不必是编译器(但它是),理论上它可以在发出诊断后继续编译代码(但它不会).

卡兹的小附录:

还有:

static auto my_car;
Run Code Online (Sandbox Code Playgroud)

这需要根据ISO C进行诊断.这是正确的,因为它声明汽车已经损坏.诊断是免费的,但关闭仪表板灯将花费你八十美元.(二十或更少,如果你从eBay购买自己的USB加密狗用于车载诊断).

上述内容extern auto my_car也需要诊断,因此除了负责停车执法的城市工作人员之外,它永远不会通过编译器运行.

如果您extern static auto ...在任何代码库中看到很多,那么您就是一个糟糕的社区; 在整个地方转向Rust之前,立即寻找更好的工作.

  • 我口中没有咖啡,可乐,粗壮或其他深色液体,这是件好事.你欠我一个电脑屏幕,@ JerryCoffin就是这样的.最好的回答! (5认同)
  • 实际上,在 Rust 中它是“extern const static auto my_car”。 (3认同)
  • 为什么用“汽车”这个名字来迷惑读者呢? (3认同)
  • @Dan:老实说,你花了很长时间才读了5行文字,然后得到的部分是:"简短的回答是,根本没有任何理由使用汽车"?真的吗?鉴于紧接在你之前的评论,似乎至少有少数人认为这是积极的贡献. (2认同)
  • 我最近通过了一次严重的大火(关闭了两个车道),表明需要`char auto my_car;` (2认同)

Meh*_*ari 83

auto是一个修饰语static.它定义变量的存储类.但是,由于局部变量的默认值是auto,您通常不需要手动指定它.

此页面列出了C中的不同存储类.

  • 在有人投票给我的答案之后,再次看到这个.你说你"通常不需要手动指定它." 我只需要问:实际上是否存在可以指定`auto`*但不会默认发生的情况? (10认同)
  • @JerryCoffin 不在 C 中。在 C++11 中,它被重新利用,您可以使用它来有效地获得局部变量类型推断。 (3认同)
  • 一种可能的用途是在 GNU C 中对嵌套函数进行前向声明 - 尽管这是对 `auto` 原始定义的劫持。http://tigcc.ticalc.org/doc/keywords.html#auto (2认同)
  • 链接的页面已过时。从 C11 开始,还有 `_Thread_local` 详细信息:http://en.cppreference.com/w/c/language/storage_duration 和 /sf/answers/1000280431/ (2认同)

Kaz*_*Kaz 40

auto关键字在C语言中无用.它存在,因为在C语言之前存在一种B语言,其中该关键字是声明局部变量所必需的.(B被发展为NB,后者成为C).

这是B参考手册.

正如您所看到的,手册中充斥着使用的示例auto.这是因为没有int关键字.需要某种关键字的说:"这是一个变量的声明",而关键字也表明无论是本地或外部(autoextrn).如果您不使用其中一个,则会出现语法错误.也就是说,x, y;它本身不是一个声明,而是auto x, y;.

由于用B语言编写的代码库必须在开发语言时移植到NB和C语言,因此语言的新版本带来了一些包袱,以提高向后兼容性,从而减少了工作量.在这种情况下auto,程序员不必每次都追捕auto并删除它.

这是从手动的现在过时"隐式int"克鲁夫特在C(能够编写明显main() { ... }没有任何int前)也来自于B.这是另一个向后兼容功能,支持B码.函数没有在B中指定的返回类型,因为没有类型.一切都是一个词,就像许多汇编语言一样.

注意如何声明一个函数extrn putchar,然后唯一能使它成为标识符使用的函数:它在函数调用表达式中使用putchar(x),这就是告诉编译器将该无类型字视为函数指针.


Mic*_*urr 22

在C中auto是一个关键字,表示变量是块的本地变量.因为这是块作用域变量的默认,这是不必要的,很少使用(我不认为我见过它在讨论关键字文字使用的例子外).如果有人可以指出auto需要使用才能获得正确的解析或行为,我会感兴趣.

然而,在C++ 11标准的auto关键字已"劫持",以支持类型推断,其中变量的类型可以从它的初始值设定的类型来采取:

auto someVariable = 1.5;   // someVariable will have type double
Run Code Online (Sandbox Code Playgroud)

添加类型推断主要是为了支持在模板中声明变量或从模板函数返回,其中基于模板参数的类型(或者在实例化模板时由编译器推导出来)通常可能非常痛苦地手动声明.


小智 11

使用旧的Aztec C编译器,可以使用命令行开关将所有自动变量转换为静态变量(以提高寻址速度).

但是明确声明的变量auto在这种情况下保持原样.(必须为递归函数,否则将无法正常工作!)


Mik*_*ail 6

auto关键字类似于Python中包含分号,它需要由以前的语言(B),但开发人员意识到这是多余的,因为大多数事情auto.

我怀疑它是留下来帮助从B到C的过渡.简而言之,一个用途是B语言的兼容性.

例如在B和80s C中:

/* The following function will print a non-negative number, n, to
   the base b, where 2<=b<=10.  This routine uses the fact that
   in the ASCII character set, the digits 0 to 9 have sequential
   code values.  */

printn(n, b) {
        extrn putchar;
        auto a;

        if (a = n / b)        /* assignment, not test for equality */
                printn(a, b); /* recursive */
        putchar(n % b + '0');
}
Run Code Online (Sandbox Code Playgroud)


Lew*_*sey 5

auto只能用于块作用域变量。extern auto int是垃圾,因为编译器无法确定它是否使用外部定义或是否使用 auto 定义覆盖 extern (而且 auto 和 extern 是完全不同的存储持续时间,例如 ,static auto int这显然也是垃圾)。它总是可以选择以一种方式解释它,而是选择将其视为错误。

有一个功能auto确实提供了,即在函数内启用“一切都是 int”规则。与函数外部不同,wherea=3被解释为定义int a =3,因为在文件范围内不存在赋值,而a=3在函数内部是一个错误,因为显然编译器总是将其解释为对外部变量的赋值而不是定义(即使有extern int a在函数或文件范围内没有前向声明),但像staticconstvolatile或 这样的说明符auto会暗示它是一个定义,并且编译器将其视为定义,但auto不具有其他说明符的副作用。auto a=3因此隐式地是auto int a = 3. 不可否认,signed a = 3具有相同的效果并且unsigned a = 3始终是无符号整数。

另请注意“auto对于是否将对象分配到寄存器没有影响(除非某些特定编译器注意到它,但这似乎不太可能)”