在C语言中,不需要将a强制转换void *
为任何其他指针类型,因此始终可以安全地对其进行提升。但是,在C ++中并非如此。例如,
int *a = malloc(sizeof(int));
在C语言中有效,但在C ++中无效。(请注意:我知道您不应该malloc
在C ++中使用,或者在这种情况下new
,应该使用智能指针和/或STL;纯粹出于好奇而问)。为什么C ++标准不允许这种隐式转换,而C标准呢?
sizeof(*a)
。
malloc
无法返回指向分配的类型的指针。 new
如果C ++确实返回了指向分配的类型的指针,那么正确编写的C ++代码将永远不会有任何void *
强制转换。
void
,C确实没有。当该关键字/思想被添加到C中时,他们对其进行了更改以适应C的需求。那是在完全检查指针类型之后不久。看看您是否可以在线找到K&R C描述手册,或诸如Waite Group的C Primer之类的C编程文本的老式副本。ANSI C充满了C ++向后移植或受其启发的功能,而K&R C则简单得多。因此,C ++扩展了当时存在的C语言,并且将您知道的C语言从C ++中剥离出来,这是更正确的做法。
long *a = malloc(sizeof(int));
糟糕,有人忘记只更改一种类型!