Ste*_*sop 11
任何限制都是实现定义的,但标准要求至少为15,见5.2.4.1
与其他任何条件相同的条件:当它出错时,以及何时不必要.最着名的例子可能是你不应该从中转换返回值malloc
.这是毫无意义的[*],它可以隐藏偶尔的错误(忘记#include stdlib.h
).另一个例子是,如果您在整数类型之间随机分散强制转换,那么最终您将抑制编译器警告缩小强制转换或者有符号和无符号值之间的比较,您应该注意这一点.在您确定代码正确之前,不应放置用于抑制此类警告的强制转换.
[*]我曾经认为有一点,因为我写的东西像:
foo *p = something;
... some time later ...
p = (foo*) malloc(n * sizeof(foo));
Run Code Online (Sandbox Code Playgroud)
演员提供了一些防止错误的保护 - 使用错误的类型sizeof
.在视觉上我可以看到转换匹配sizeof
,并且编译器检查变量是否与转换匹配,所以我有安全.
现在我写道:
p = malloc(n * sizeof(*p));
Run Code Online (Sandbox Code Playgroud)
我不需要检查安全性,因为我确实为p的类型分配了正确大小的内存.好吧,假设乘法不会溢出.
正如另一个答案所指出的那样,是实现定义的,但是大型链可能会出现一些问题(特别是构建时间)。这也可能是一种“代码味道”,表明封装不良。
最简单的答案是“当不需要时”,即自动,例如 float 到 double,int 到 long(适当时[*])。我也认为它几乎肯定会询问从 void * 到其他东西的转换,例如使用 malloc(comp.lang.c FAQ item)。
[*] 见评论
归档时间: |
|
查看次数: |
4772 次 |
最近记录: |