【发布时间】:2016-10-25 23:53:30
【问题描述】:
问题空间:
我在理解以下最终参数的语法时遇到了一点麻烦,它是作为参数传递的函数指针:
qsort(
(void **) lineptr, 0, nlines - 1,
/* Can't understand the following syntax */
(int (*)(void*, void*))(numberic ? numcmp : strcmp)
);
我确实理解了另一种方法:
int (*fn)(void*, void*);
if(numeric) {
fn = numcmp;
} else {
fn = strcmp;
}
它们都产生编译器错误:warning: assignment from incompatible pointer type。
代码:
#include <stdio.h>
#include <string.h>
#include "alloc.h"
#include "line.h"
#include "qsort.h"
#include "numcmp.h"
char *lineptr[MAXLINES];
int main(int argc, char *argv[])
{
int nlines; /* number of input lines read */
int numeric = 0;
if (argc > 1 && strcmp(argv[1], "-n") == 0)
numeric = 1;
if((nlines = readlines(lineptr, MAXLINES)) >= 0) {
/*
qsort with custome soring function passed as a parameter
throught pointers
*/
int (*fn)(void*, void*);
if(numeric) {
fn = numcmp;
} else {
fn = strcmp;
}
qsort((void **) lineptr, 0, nlines - 1, fn);
/*
Alternative:
qsort(
(void **) lineptr, 0, nlines - 1,
(int (*)(void*, void*))(numberic ? numcmp : strcmp)
);
*/
printf("Sorted and tailed:\n");
writelines(lineptr, nlines);
return 0;
} else {
printf("error: input to big to sort\n");
return 1;
}
}
【问题讨论】:
-
警告有什么不清楚的地方? (我假设你已经阅读了
qsort的手册并且知道它的参数。) -
没什么只是想指出,以防其他人会代替。我想我只需要更改指针类型以匹配函数。
-
@KerrekSB 是的,我做了
man qsort,他们似乎都是(const void *, const void *)。 -
(int (*)(void*, void*))whatever是whatever到相应类型的转换(指向返回 int 并采用两个void *参数的函数的指针)。 -
提示:如果代码是干净的,则不需要强制转换。
标签: c pointers function-pointers