C的“auto”关键字的目标

knpiaxh1  于 2023-08-03  发布在  其他
关注(0)|答案(6)|浏览(122)

在C语言中auto关键字的目的是什么?在C++ 0x中,它有了新的含义,但这是否意味着如果我将C代码移植到C++ 0x编译器中,我的代码就会中断?

yx2lnoni

yx2lnoni1#

如果你的代码包含auto关键字,它就会中断。在近30年的C和C编程中,我从未遇到过任何这样的情况。这个关键字是在第一个C编译器中引入的,用来指定局部函数变量,但是编译器几乎立即变得足够聪明,不需要它,并且很少有使用它的代码能够存活到今天-这就是为什么C0x选择回收它,而不是引入一个新的关键字,这会导致可移植性问题。
在C++0X中,auto关键字的目的是允许编译器计算出变量的类型,在可能的情况下:

vector <int> v;
auto it = v.begin():

字符串
编译器可以看到v.开始()必须返回vector<int>::iterator,因此可以创建该类型的变量,从而节省大量键盘输入或typedef创建。

kfgdxczn

kfgdxczn2#

Bjarne Stroustrup在他的C++0x FAQ中提到了auto
auto的旧含义(“这是一个局部变量”)是多余的,不被使用。几位委员会成员在数百万行代码中搜索,只发现了少数几个用途--而且大多数都是在测试套件中,或者看起来是bug。
所以我假设,编译器不会被标准强制实现auto的旧含义。

mbjcgjjk

mbjcgjjk3#

在C中,auto指定自动存储持续时间(与staticexternregister相对)。由于这是默认值,我从未见过在任何代码中使用auto。我没做过很多C。

k10s72fa

k10s72fa4#

这个答案是错误的,见following question,我把答案留在这里作为参考。
AFAIK C++0x对auto的使用与C对auto的传统用法并不矛盾。在C中,auto与type一起使用。

auto char c1 = 'a'; // OK, old meaning of auto is still valid
auto c2 = 'b'; // OK, new meaning of auto (deduce c2 is a char)

字符串
它唯一可以改变代码含义的地方是auto与 *implicit int * 规则一起使用时(如果没有指定type->它是int),在这种情况下,我的示例中的第二行过去是int类型的c2,现在是char类型。

isr3a4wc

isr3a4wc5#

很少使用;它意味着一个局部变量。现代的编译器,如VS2010 C++给予它一个new meaning

6xfqseft

6xfqseft6#

以下是一个老问题的最新答案:
根据我40多年的C编程经验,包括编译器工作,auto关键字在C语言中已经完全没用了50年。您不太可能在C代码中使用过这个关键字,因此这种语义更改不会引起可移植性问题(但许多其他语义更改会导致可移植性问题)。
然而,请注意,最近提出的C23标准中的最新进展在C中给予auto提供了更新的语义,以C为模型。
auto似乎是B的遗留物,B是C语言的前身,由贝尔实验室的Ken Thompson和Dennis里奇在60年代末和70年代初开发。
在C23之前,auto只能用于为函数作用域中的定义指定自动存储类。这是默认值,因此auto是完全冗余的,只要指定了类型或其他限定符,就可以删除auto。在任何情况下都不需要它,所以它包含在C标准中只是植根于C语言的早期历史。
auto从C
11开始就在C中使用,以支持变量定义中的类型推断,无论是否有自动存储,编译器都会从初始化器的类型中检测类型。
随着当前的趋势推动C和 C
在一个公共子集上的收敛,在C23中,这个关键字被附加了新的语义,以C++语义为模型,但更受限制:

6.7.1存储类说明符

auto可以与除typedef之外的所有其他的一起出现;
auto只能出现在文件范围的标识符的声明说明符中,或者如果要从初始化器推断类型,则与其他存储类说明符沿着出现。
如果auto与另一个存储类说明符一起出现,或者如果它出现在文件范围的声明中,则为了确定链接的存储持续时间,将忽略它。然后,它仅指示可以推断所声明的类型。
类型推断被指定为:

6.7.9类型推断
约束条件

1推断类型的声明应包含存储类说明符auto

说明

2对于作为对象定义的这种声明,init-declarator应具有以下形式之一

  • 直接声明符=赋值表达式 *
  • 直接声明符= {赋值表达式}*
  • direct-declarator = { assignment-expression,}*

声明的类型是左值、数组到指针或函数到指针转换后的赋值表达式的类型,另外由限定符限定,并由声明说明符中出现的属性修改(如果有的话)。如果直接声明符不是 identifier attribute-specifier-sequenceopt 的形式,可能包含在平衡的括号对中,则行为未定义。
类型推断在C++中非常有用,因为类型可能非常复杂,几乎不可能在变量定义中指定,特别是在模板中。相反,在C中使用它可能会适得其反,降低代码可读性,鼓励懒惰和容易出错的做法。在typedef后面隐藏指针已经够糟糕的了,现在你可以用auto关键字完全隐藏它们。
为了完成一个不那么严肃的笔记,我记得在棘手的面试测试中看到过它,候选人被要求找出为什么这段代码无法编译:

#include <stdio.h>
#include <string.h>

int main(void) {
    char word[80];
    int auto = 0;
    while (scanf("%79s", word) == 1) {
        if (!strcmp(word, "car")
        ||  !strcmp(word, "auto")
        ||  !strcmp(word, "automobile"))
            auto++;
    }
    printf("cars: %d\n", auto);
    return 0;
}

字符串

相关问题