为什么c ++禁止void *的隐式转换?
这个问题在这里已经有了答案:
在C ++中,与C不同,您必须投射malloc的结果。 您的代码可以通过简单的演员调整为工作顺序。
int *a = (int *)malloc(sizeof(int));
关于这个强制演员的一篇很好的文章及其背后的原因可以在这里找到。
可以在这里找到一个供参考的附加链接。
编辑:正如评论中所建议的, malloc()
的使用不应该是司空见惯的。 最接近的选择是使用new
分配。
int *a = new int[15];
其他编辑:如同在评论中再次建议的那样,如果你必须使用malloc()
,至少应该使用C ++类型转换。
int *a = static_cast<int*>malloc(sizeof(int)); // shout out to @edheal, @mgetz
您可以使用C ++进行转换,但需要转换。 C ++旨在成为比C更类型安全的语言,因此它试图关闭C允许的一些“类型系统漏洞”。
在C中,这将被接受而不需要任何诊断:
int x;
void *p = &x;
double *q = p;
*q = 0.0;
在源代码中没有任何强制转换的情况下违反了类型安全。
这是由C ++的发明人B. Stroustrup回答的C ++ FAQ。
C ++不禁止转换; 它只是希望它被源代码中的某种blogue记录下来,即一个演员,如果没有证明,至少表明它是有意完成的。
关于void *
的起源,Stroustrup写道这个(bolding mine):
在其历史的后期,C with Classes *开始支持''原始记忆指针的概念, void *
。 void *
的起源笼罩在一些谜团中。 我隐约记得与拉里罗斯勒和史蒂夫约翰逊一起发明它。 然而,戴夫普罗瑟记得首先建议它基于“某处在澳大利亚”使用的东西。 可能这两个版本都是正确的,因为戴夫当时与拉里密切合作。 在任何一种情况下, void *
被同时引入到两种语言中 。 我能找到的最早提到的void *
是在1983年1月1日的备忘录中关于我的C ++编译器Cfront提供的内存管理机制,因此C ++中void *
的起源必须至少回溯到1982年中期。 ANSI C语境下void *
最早的书面记录是迈克梅斯纳(Mike Meissner)在日期为“12月12日”的提案,它提出了void *
基本上它在1984年6月被ANSI C接受[Prosser,2001]
因此,C ++继承了Stroustrup最初设想的void *
概念,而与此同时,C类人员在类型安全方面略有不同的想法。
在malloc
的情况下,当然存在危险; 但是那些已经被众所周知的标识符malloc
的存在标记; 演员阵容并没有带来更多的东西,但并不要求它专门针对malloc
,而在其他地方需要它会成为规则的一个尴尬例外。
*“带类的C”是C ++的前身
链接地址: http://www.djcxy.com/p/28427.html