c - 何时以及何时不在 C 中进行类型转换有冲突?
问题描述
我在此处和此处阅读有关搜索和排序功能的 GLibC 参考, 在其中一个代码示例中,使用了类型转换,而在另一个示例中,它不是:
第一:
int
compare_doubles (const void *a, const void *b)
{
const double *da = (const double *) a;
const double *db = (const double *) b;
return (*da > *db) - (*da < *db);
}
第二个:
int
critter_cmp (const void *v1, const void *v2)
{
const struct critter *c1 = v1;
const struct critter *c2 = v2;
return strcmp (c1->name, c2->name);
}
在第二个示例中是否有任何原因,例如
const struct critter *c1 = (const struct critter *)v1;
没用过?还是只是为了简洁而这样做?
编辑:如果编译器可以推断出它,那么在第一个示例中是否需要强制转换?这种事情有什么最佳实践吗?
解决方案
void *
与任何对象指针类型之间的转换都可以安全地完成而无需强制转换。这在C 标准的第 6.3.2.3p1 节中指定:
指向的指针
void
可以转换为指向任何对象类型的指针或从指向任何对象类型的指针转换。指向任何对象类型的指针都可以转换为指向void
和返回的指针;结果应与原始指针比较。
正因为如此,第二个函数就可以了,第一个函数可以安全地写成:
int
compare_doubles (const void *a, const void *b)
{
const double *da = a;
const double *db = b;
return (*da > *db) - (*da < *db);
}
作为一般规则,除非绝对必须,否则您不应该施放。
推荐阅读
- forms - 如何在 Chromedp 中发布请求,模拟表单
- python - 如何测试一个对象是由另一个对象创建的?
- django - Gitlab CI 管道故障
- python - 如何在不使用 geopandas 的情况下从 geojason 文件创建数据框?
- sorting - 根据另一个数组对数组进行排序
- python - 如何在我的代码中包含两个不同的 PIP 版本的 pyyaml?
- c++ - 在 omnetpp 项目构建中遇到错误
- ios - FlutterFire 消息传递中的连接和未知错误(仅限 iOS)
- code-snippets - SO Snippet 无法正确读取 childNodes
- java - Selenium WebDriver Java:使用 Auth0 作为后端的弹出窗口