在 qsort 比较函数上出错

Getting an error on a qsort compare function

我使用的是 C++Builder 10.4.2,但遇到了 qsort 问题。我很少使用 qsort 所以我可能会犯一个笨拙的错误。数组 'buffer' 是一个二维 'char' 数组,包含超过 26,000 行的单个单词。

这是电话:

qsort((void *)buffer,wordcount,sizeof(buffer[1]),sort_function);

这是比较函数:

int TForm::sort_function(const void *a, const void *b)
{
  return( strcmp((char *)a,(char *)b) );
}

这是错误信息。请注意,它在抱怨第 4 个参数的 sort_function

search.h(46): candidate function not viable: no known conversion from 'int (__closure *)(const void *, const void *)' to 'int (*)(const void *, const void *) __attribute__((cdecl))'

什么是'int (__closure *)'?有没有办法修复我的比较功能?

__closure 是 Borland 编译器扩展,用于获取指向非 static class 方法的指针,而不考虑所使用的 class 类型。这在 VCL/FMX 组件中最常用,它允许你从任何你想要的 class 分配事件处理程序,这不是标准 C++ 通常允许你做的事情。

qsort() 在第 4 个参数中需要一个 C 风格的函数指针。你不能得到这样一个指向 non-static class 方法的指针。

要解决这个问题,您需要使用:

  • 独立函数
  • 一种staticclass方法
  • a 非捕获 C++ lambda(仅限 C++11 或更高版本)

由于您的 sort_function() 不需要访问您的 TForm 对象,将 sort_function() 声明为 static 将是最简单的解决方法:

// .h

class TForm
{
...
private:
    static int sort_function(const void *a, const void *b);
    void doSomething();
...
};
// .cpp

int TForm::sort_function(const void *a, const void *b)
{
    return strcmp((const char *)a, (const char *)b);
}

void TForm::doSomething()
{
    ...
    qsort(buffer, wordcount, sizeof(buffer[1]), sort_function);
    ...
}

但是,它确实应该是一个独立的函数,因为它实际上与您的 TForm class 完全没有关系:

// .cpp

static int sort_function(const void *a, const void *b)
{
    return strcmp((const char *)a, (const char *)b);
}

void TForm::doSomething()
{
    ...
    qsort(buffer, wordcount, sizeof(buffer[1]), sort_function);
    ...
}