何时以及何时不在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);
}

作为一般规则,除非绝对必要,否则不应强制转换。


以上是何时以及何时不在C中进行类型转换存在冲突?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>