问题空间:
我在理解以下最终参数的语法时遇到一些麻烦,这是一个作为参数传递的函数指针:
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;
}
}
答案 0 :(得分:0)
它本质上是从三元表达式的结果到函数指针的转换,该函数指针应该是qsort
中的相应参数。因此,沿(a)b
行,b
三元表达式,a
函数指针声明。
int (*)(void*, void*)
声明一个指向函数的指针,该函数接受两个void *
个参数并返回int
。
关于(*)
:
发现差异。
有一个很棒的实用工具cdecl
可以解释这些声明。这是针对您的情况:
cdecl> explain (int (*)(void*, void*))
cast unknown_name into pointer to function (pointer to void, pointer to void) returning int
(遗憾的是,当使用三元表达时,它似乎失败了:'坏人物&#39;:&#39;。你必须把那部分搞定。)
在cdecl.org在线试用,或在本地安装。
(关于解密C声明的was on Hacker News recently的相关讨论,其中提到了clockwise/spiral rule的替代方案。)