0

在头文件中,我有以下行:

typedef int comparator(int* left, int* right);

但是当我尝试为它编写一个函数定义时:

int comparator (int* left, int* right){
    if(left<right) {
        return 1;
    } else if(right>left) {
        return -1;
    } else {
        return 0;
    }   
}

我得到的错误是:

file.c:10:错误:“比较器”重新声明为不同类型的符号

该函数必须是 typedef 的,因为稍后在头文件中它会在方法原型中使用,如下所示:

struct bst_node** search(struct bst_node** root, comparator compare, void* data);

那么这个方法是如何构造的呢?

4

3 回答 3

4

在你的头文件中你应该有

 int comparator(int* left, int* right);

您没有声明类型,而只是声明了一个函数。

您可以声明一个称为比较器的函数指针类型...

typedef int (*comparator)(int* left, int* right);

但是您不会再创建一个称为比较器的函数。你只需要制作一个具有相同签名的函数

int ascending_comparator(int* left, int* right)
{
    // comparison
} 

然后打电话

search(root, ascending_comparator, data);

另外,我有一种感觉,您不想传递 int* 而是传递实际的 int,或者在您的函数中您不想比较指针,而是比较每个 int 指向的值,例如

int comparator (int* left, int* right){
    if(*left < *right) {
        return 1;
    } else if(*right > *left) {
        return -1;
    } else {
        return 0;
    }   
}

但可能您想要比较存储整数的内存位置。

你的比较也是一样的

if(left < right) 

是相同的

if( right > left)

所以也许你想要

 int comparator (int* left, int* right){
        if(*left < *right) {
            return 1;
        } else if(*left > *right) {
            return -1;
        } else {
            return 0;
        }   
    }
于 2012-12-22T20:28:30.070 回答
3

我怀疑您实际上并不想创建 typedef,而是想使用原型声明函数。写就够了

int comparator(int *left, int *right);
于 2012-12-22T20:28:19.917 回答
2

如果typedef不是错误,你现在有一个被调用的类型comparator,你不能使用这个标识符作为一个函数,不管现有类型是否是一个函数指针,它和写这个一样:

typedef int myType;

int myType(int, int);

你可以typedef像这样使用它:

typedef int (* comparator)(int, int);

int comparison(int, int);
void sort(int [], comparator);

int main(void)
{
  int array[10];
  sort(array, comparison);
}

如果您正在寻找函数声明并且这typedef是一个错误,那么其他答案已经为您提供了解决方案。

编辑:也许我错了,但是阅读评论,您似乎对typedef. 函数有它们的类型(main可以有 typeint ()(void)int ()(int, char **)),你只是说comparator可以用作类型,这意味着int ()(int *, int *).

如果你写:

typedef double real;

您没有创建(从技术上讲,定义)任何double对象,您只是在说“从现在开始,real意味着double”。

于 2012-12-22T20:37:42.003 回答