在C语言中auto关键字的目的是什么?在C++ 0x中,它有了新的含义,但这是否意味着如果我将C代码移植到C++ 0x编译器中,我的代码就会中断?
auto
yx2lnoni1#
如果你的代码包含auto关键字,它就会中断。在近30年的C和C编程中,我从未遇到过任何这样的情况。这个关键字是在第一个C编译器中引入的,用来指定局部函数变量,但是编译器几乎立即变得足够聪明,不需要它,并且很少有使用它的代码能够存活到今天-这就是为什么C0x选择回收它,而不是引入一个新的关键字,这会导致可移植性问题。在C++0X中,auto关键字的目的是允许编译器计算出变量的类型,在可能的情况下:
vector <int> v; auto it = v.begin():
字符串编译器可以看到v.开始()必须返回vector<int>::iterator,因此可以创建该类型的变量,从而节省大量键盘输入或typedef创建。
vector<int>::iterator
kfgdxczn2#
Bjarne Stroustrup在他的C++0x FAQ中提到了auto:auto的旧含义(“这是一个局部变量”)是多余的,不被使用。几位委员会成员在数百万行代码中搜索,只发现了少数几个用途--而且大多数都是在测试套件中,或者看起来是bug。所以我假设,编译器不会被标准强制实现auto的旧含义。
mbjcgjjk3#
在C中,auto指定自动存储持续时间(与static、extern、register相对)。由于这是默认值,我从未见过在任何代码中使用auto。我没做过很多C。
static
extern
register
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类型。
int
c2
char
isr3a4wc5#
很少使用;它意味着一个局部变量。现代的编译器,如VS2010 C++给予它一个new meaning。
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从C11开始就在C中使用,以支持变量定义中的类型推断,无论是否有自动存储,编译器都会从初始化器的类型中检测类型。随着当前的趋势推动C和 C 在一个公共子集上的收敛,在C23中,这个关键字被附加了新的语义,以C++语义为模型,但更受限制:
6.7.1存储类说明符
auto可以与除typedef之外的所有其他的一起出现;auto只能出现在文件范围的标识符的声明说明符中,或者如果要从初始化器推断类型,则与其他存储类说明符沿着出现。如果auto与另一个存储类说明符一起出现,或者如果它出现在文件范围的声明中,则为了确定链接的存储持续时间,将忽略它。然后,它仅指示可以推断所声明的类型。类型推断被指定为:
typedef
6.7.9类型推断约束条件
1推断类型的声明应包含存储类说明符auto。
说明
2对于作为对象定义的这种声明,init-declarator应具有以下形式之一
声明的类型是左值、数组到指针或函数到指针转换后的赋值表达式的类型,另外由限定符限定,并由声明说明符中出现的属性修改(如果有的话)。如果直接声明符不是 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; }
字符串
6条答案
按热度按时间yx2lnoni1#
如果你的代码包含
auto
关键字,它就会中断。在近30年的C和C编程中,我从未遇到过任何这样的情况。这个关键字是在第一个C编译器中引入的,用来指定局部函数变量,但是编译器几乎立即变得足够聪明,不需要它,并且很少有使用它的代码能够存活到今天-这就是为什么C0x选择回收它,而不是引入一个新的关键字,这会导致可移植性问题。在C++0X中,auto关键字的目的是允许编译器计算出变量的类型,在可能的情况下:
字符串
编译器可以看到v.开始()必须返回
vector<int>::iterator
,因此可以创建该类型的变量,从而节省大量键盘输入或typedef创建。kfgdxczn2#
Bjarne Stroustrup在他的C++0x FAQ中提到了
auto
:auto的旧含义(“这是一个局部变量”)是多余的,不被使用。几位委员会成员在数百万行代码中搜索,只发现了少数几个用途--而且大多数都是在测试套件中,或者看起来是bug。
所以我假设,编译器不会被标准强制实现
auto
的旧含义。mbjcgjjk3#
在C中,
auto
指定自动存储持续时间(与static
、extern
、register
相对)。由于这是默认值,我从未见过在任何代码中使用auto
。我没做过很多C。k10s72fa4#
这个答案是错误的,见following question,我把答案留在这里作为参考。
AFAIK C++0x对
auto
的使用与C对auto
的传统用法并不矛盾。在C中,auto
与type一起使用。字符串
它唯一可以改变代码含义的地方是auto与 *implicit
int
* 规则一起使用时(如果没有指定type->它是int
),在这种情况下,我的示例中的第二行过去是int
类型的c2
,现在是char
类型。isr3a4wc5#
很少使用;它意味着一个局部变量。现代的编译器,如VS2010 C++给予它一个new meaning。
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
从C11开始就在C中使用,以支持变量定义中的类型推断,无论是否有自动存储,编译器都会从初始化器的类型中检测类型。随着当前的趋势推动C和 C 在一个公共子集上的收敛,在C23中,这个关键字被附加了新的语义,以C++语义为模型,但更受限制:
6.7.1存储类说明符
auto
可以与除typedef
之外的所有其他的一起出现;auto
只能出现在文件范围的标识符的声明说明符中,或者如果要从初始化器推断类型,则与其他存储类说明符沿着出现。如果
auto
与另一个存储类说明符一起出现,或者如果它出现在文件范围的声明中,则为了确定链接的存储持续时间,将忽略它。然后,它仅指示可以推断所声明的类型。类型推断被指定为:
6.7.9类型推断
约束条件
1推断类型的声明应包含存储类说明符
auto
。说明
2对于作为对象定义的这种声明,init-declarator应具有以下形式之一
声明的类型是左值、数组到指针或函数到指针转换后的赋值表达式的类型,另外由限定符限定,并由声明说明符中出现的属性修改(如果有的话)。如果直接声明符不是 identifier attribute-specifier-sequenceopt 的形式,可能包含在平衡的括号对中,则行为未定义。
类型推断在C++中非常有用,因为类型可能非常复杂,几乎不可能在变量定义中指定,特别是在模板中。相反,在C中使用它可能会适得其反,降低代码可读性,鼓励懒惰和容易出错的做法。在typedef后面隐藏指针已经够糟糕的了,现在你可以用
auto
关键字完全隐藏它们。为了完成一个不那么严肃的笔记,我记得在棘手的面试测试中看到过它,候选人被要求找出为什么这段代码无法编译:
字符串