qsort:是否将比较器函数本身或参数放到比较器函数的主体中?

j

有两种明显的使用方式qsort:在比较器中强制转换:

int cmp(const void *v1, const void *v2) 
{
    const double *d1 = v1, *d2 = v2;
    ⋮
}

qsort(p, n, sizeof(double), cmp);

或投放比较器:

int cmp(const double *d1, const double *d2) 
{
    ⋮
}

qsort(p, n, sizeof(double), (int (*)(const void *, const void *))cmp);

我倾向于使用前者,出于美学原因,而不是其他任何原因。是否有任何技术上的原因偏爱一个?

dbush

您应避免使用后一种情况,因为这是无效的。

为了使两种功能类型兼容,返回类型必须兼容,而相应的参数类型必须兼容。Aconst void *与不兼容,const double *因此功能类型不兼容。通过不兼容的指针类型调用函数会导致未定义的行为

请注意,仅仅因为两个类型可以隐式转换并不意味着它们是兼容的取的示例const double *const void *,能够不流延来进行两种类型之间的转换,然而,表示这两种类型的不需要是相同的。

这意味着aconst double *传递给函数的方式可能与a传递给函数的方式不同const void *因此,通过像调用typeint (*)(const double*, const double*)一样调用type函数,int (*)(const void*, const void*)可能会以错误的方式传递参数。

尽管x64和ARM系统通常对所有指针类型都使用相同的表示形式,但是您可能会放弃使用前一种表示法,但是仍然无法保证。现代编译器通常会假定未定义的行为不会发生,并根据该事实进行优化。

前一种情况是正确的方法,因为函数签名与qsort函数期望值兼容

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

qsort() - 比较函数参数

来自分类Dev

将比较器传递给超级构造函数

来自分类Dev

如何将比较器传递给类的构造函数

来自分类Dev

R中是否有>,<,==比较器的函数版本?

来自分类Dev

将比较函数作为参数传递给实体框架

来自分类Dev

如何将比较器添加到自定义排序函数

来自分类Dev

是否将参数副本或参数本身传递给__init__中的函数?

来自分类Dev

如何将比较器a-la std :: less传递给C风格的Qsort?

来自分类Dev

将比较器传递给Java中的collections.sort()?

来自分类Dev

qsort()函数可以与函数模板一起用作比较器吗?

来自分类Dev

函数类作为比较器

来自分类Dev

比较javascript中的函数参数

来自分类Dev

qsort比较器分段错误

来自分类Dev

将字典作为参数传递给python中的函数,其中参数本身就是函数

来自分类Dev

如何将比较运算符作为参数传递给函数?

来自分类Dev

为什么需要将比较函数类型指定为模板参数?

来自分类Dev

比较范围构造函数中的迭代器value_type

来自分类Dev

成员函数充当地图比较器?

来自分类Dev

Scala比较器,如序列函数

来自分类Dev

从比较函数访问成员变量/获取器

来自分类Dev

std::set 比较器函数如何工作?

来自分类Dev

树图比较器函数重载

来自分类Dev

有关作为参数传递给qsort()函数的比较函数的问题

来自分类Dev

比较bash脚本函数中的参数

来自分类Dev

C ++将函数本身作为参数传递

来自分类Dev

将比较器传递给java Collections.disjoint

来自分类Dev

将比较器与泛型一起使用

来自分类Dev

这个Matlab函数的主体起作用,但函数本身不起作用(interp1错误)

来自分类Dev

Python范围函数本身

Related 相关文章

热门标签

归档