Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 定义返回函数指针的函数有哪些不同风格_C_Pointers - Fatal编程技术网

C 定义返回函数指针的函数有哪些不同风格

C 定义返回函数指针的函数有哪些不同风格,c,pointers,C,Pointers,我有一个功能: int compare(char * c1, char * c2){ ... ... } 我可以编写返回指针进行比较的函数int ret_comparevoid*项的各种样式是什么?有两种主要样式,一种使用typedef,另一种不使用两种typedef变体。比较器应采用常量指针,如下所示: int compare(const char *c1, const char *c2) { ... } // Raw definition of a function returning

我有一个功能:

int compare(char * c1, char * c2){
...
...
}

我可以编写返回指针进行比较的函数int ret_comparevoid*项的各种样式是什么?

有两种主要样式,一种使用typedef,另一种不使用两种typedef变体。比较器应采用常量指针,如下所示:

int compare(const char *c1, const char *c2) { ... }

// Raw definition of a function returning a pointer to a function that returns an int
// and takes two constant char pointers as arguments
int (*ret_compare1(void *item))(const char *, const char *)
{
    // Unused argument - item
    return compare;
}

// More usual typedef; a Comparator2 is a pointer to a function that returns an int
// and takes two constant char pointers as arguments
typedef int (*Comparator2)(const char *, const char *);

// And ret_compare2 is a function returning a Comparator2
Comparator2 ret_compare2(void *item)
{
    // Unused argument - item
    return compare;
}

// Less usual typedef; a Comparator3 is a function that returns an int
// and takes two constant char pointers as arguments
typedef int Comparator3(const char *, const char *);

// And ret_compare3 is a function returning a pointer to a Comparator3
Comparator3 *ret_compare3(void *item)
{
    // Unused argument - item
    return compare;
}
请注意,这些比较器不能与bsearch和qsort一起使用,除非您使用相当可怕的强制转换,因为这些比较器应该采用const void*参数

还请注意,对于比较字符串(而不是单个字符),qsort或bsearch使用的函数应类似于:

int string_comparator(const void *v1, const void *v2)
{
    const char *s1 = *(char **)v1;
    const char *s2 = *(char **)v2;
    return(strcmp(s1, s2));
}

有两种主要样式,一种使用typedef,另一种不使用两种typedef变体。比较器应采用常量指针,如下所示:

int compare(const char *c1, const char *c2) { ... }

// Raw definition of a function returning a pointer to a function that returns an int
// and takes two constant char pointers as arguments
int (*ret_compare1(void *item))(const char *, const char *)
{
    // Unused argument - item
    return compare;
}

// More usual typedef; a Comparator2 is a pointer to a function that returns an int
// and takes two constant char pointers as arguments
typedef int (*Comparator2)(const char *, const char *);

// And ret_compare2 is a function returning a Comparator2
Comparator2 ret_compare2(void *item)
{
    // Unused argument - item
    return compare;
}

// Less usual typedef; a Comparator3 is a function that returns an int
// and takes two constant char pointers as arguments
typedef int Comparator3(const char *, const char *);

// And ret_compare3 is a function returning a pointer to a Comparator3
Comparator3 *ret_compare3(void *item)
{
    // Unused argument - item
    return compare;
}
请注意,这些比较器不能与bsearch和qsort一起使用,除非您使用相当可怕的强制转换,因为这些比较器应该采用const void*参数

还请注意,对于比较字符串(而不是单个字符),qsort或bsearch使用的函数应类似于:

int string_comparator(const void *v1, const void *v2)
{
    const char *s1 = *(char **)v1;
    const char *s2 = *(char **)v2;
    return(strcmp(s1, s2));
}

比较函数的参数不应该是void*?@Bruce这与您作为示例使用的比较函数相同。typedef的第二个变体经常被忽略。我喜欢它,因为这样头文件可以将comparator函数声明为Comparator2 compare1;比较器2比较器2;这就100%清楚地表明,该函数将用作比较器2。另外,当传递给函数时,funcComparator2 cmp与funcComparator2*cmp相同。@Bruce-这取决于API。qsort API需要int*const void*,const void*。示例代码的API是int*char*,char*。这个答案中更理智的API使用const char*来防止意外修改比较器中的值。@布鲁斯:这取决于上下文。如果您计划将比较器与标准的bsearch或qsort函数一起使用,那么是的,参数应该是const void*,并且通常,字符串比较的基础值是char**而不是char*。但是,由于原始函数是int comparechar*c1,char*c2{…},因此我保留了原始函数的类型并添加了const类型限定符。这将在自定义代码中使用,而不是与qsort一起使用。比较函数的参数是否应为void*?@Bruce这与您作为示例使用的比较函数相同。typedef的第二个变体经常被忽略。我喜欢它,因为这样头文件可以将comparator函数声明为Comparator2 compare1;比较器2比较器2;这就100%清楚地表明,该函数将用作比较器2。另外,当传递给函数时,funcComparator2 cmp与funcComparator2*cmp相同。@Bruce-这取决于API。qsort API需要int*const void*,const void*。示例代码的API是int*char*,char*。这个答案中更理智的API使用const char*来防止意外修改比较器中的值。@布鲁斯:这取决于上下文。如果您计划将比较器与标准的bsearch或qsort函数一起使用,那么是的,参数应该是const void*,并且通常,字符串比较的基础值是char**而不是char*。但是,由于原始函数是int comparechar*c1,char*c2{…},因此我保留了原始函数的类型并添加了const类型限定符。这将在自定义代码中使用,而不是在qsort中使用。