对于下面的C代码,比较int指针a和b的定义;
#include#include int main() { int *a=malloc(sizeof(int)); int *b=(int *)malloc(sizeof(int)); return(0); }
以任何方式更好地类推由malloc函数返回的void类型的指针?或者在分配到左侧的int指针时是自动类型化的吗?在哪种情况下,如果有的话,它是否可以证明是必要的而不仅仅是强制性的?
请说明隐式类型转换,右侧类型转换为左侧类型,是否适用于此处.
C语言不需要强制转换,但是对于C++兼容性,您可能需要强制转换.这是C不是C++子集的地方之一.
以下将用C语言编译,但不能用C++编译:
int *a=malloc(sizeof(int));
以下将在C和C++中编译:
int *b=(int *)malloc(sizeof(int));
有人投了指针,我没有.
是的,类型转换"自动"发生
它在C中永远不必要.
以一种奇怪的方式,转换结果会影响 C++的可移植性.从C++引用的模块很可能被编译为C,在这种情况下它无关紧要.但是如果代码以某种方式被复制并粘贴到C++中,我认为你希望每个这样的行被标记,因为在C++中调用malloc()的代码行是一个可疑的LoC.
在某种程度上,这是早期K&R C的延续,没有这种类型void
,所以malloc()
返回了char *
.现在,你需要做演员表.因此,铸造的设计模式malloc()
开发并影响了编写下一组代码的所有人,并且人们仍然在阅读这些代码体,并将模式向前推进.但C89无效,所以是时候简化代码了.
根据它的确切方式,演员可能会违反DRY(又名DIE).正如Chris Lutz指出的那样,它会不必要地降低抽象级别.由于在开始的C程序中并不完全是天价,我宁愿不要失去我们所拥有的水平.
简而言之:
如果你已经包含了stdlib.h
,那么演员阵容绝对没有,应该被删除.毕竟,您已经指定了类型.
如果你还没有,那么演员将掩盖错误,这是不好的.
切勿在C代码中使用该转换.
在C++中,强制转换是必要的,因为C++不允许在void *
其他指针类型之间进行隐式转换.另一方面,在C++中,有比使用容器类更好的东西malloc()
,比如new
容器类.
编写将在其中编译的代码毫无意义.你应该总是知道你正在写什么语言,并且在子集中写作会强迫你使用一种在任何一种语言中都较差的结构.我熟悉的C++编译器也将编译C代码,C++中有明确的规定可以轻松地与C代码链接.如果您将其编译为C++,则错误消息(没有强制转换)将指出您的错误.
所有演员都会做的是掩盖可以在其他地方咬你的错误.它不会做任何有用的事情.不要这样做.
在C中,演员阵容是不必要的.malloc
返回a void*
,C标准声明:
指向void的指针可以转换为指向任何不完整或对象类型的指针.指向任何不完整或对象类型的指针可能会转换为指向void的指针并再次返回; 结果应该等于原始指针.
此外,K&R2说:
任何指向对象的指针都可以转换为void*类型而不会丢失信息.如果结果转换回原始指针类型,则恢复原始指针.与Par.A.6.6中讨论的指针到指针转换(通常需要显式转换)不同,指针可以分配给void*类型的指针,也可以与它们进行比较.
关于C++兼容性可能有一点,因为在C++中,强制转换是强制性的.然而,恕我直言,这几乎不相关,因为惯用的C++要求使用new
而不是malloc
反正.