我在编写本书第5.11节中介绍的示例程序时遇到了问题.我删除了大部分代码,只留下了相关内容.
#define MAXLINES 5000 char *lineptr[MAXLINES]; void qsort1(void *lineptr[], int left, int right, int (*comp)(void *, void *)); int numcmp(char *, char *); main(int argc, char *argv[]) { int numeric = 1; /* ... */ qsort1((void**) lineptr, 0, 100, (int (*)(void*, void*))(numeric ? numcmp : strcmp)); } void qsort1(void *v[], int left, int right, int (*comp)(void *, void *)) { /* ... */ } int numcmp(char *s1, char *s2) { /* ... */ }
问题是代码无法编译(我正在使用Digital Mars编译器).我得到的错误是这样的:
qsort1((void**) lineptr, 0, nlines - 1, (int (*)(void*, void*))(numeric ? numcmp : strcmp)); ^ go.c(19) : Error: need explicit cast to convert from: int (*C func)(char const *,char const *) to : int (*C func)(char *,char *) --- errorlevel 1
虽然我正确地粘贴了书中的代码,但声明必定有问题.我不知道做出正确的更改(关于函数指针的部分当然可以更广泛地编写).
编辑:我应该提到我正在阅读本书的ANSI版本.
我认为错误来自于旧的C还不知道const的事实:strcmp有两个指向非const字符的指针(char *
)我认为(这可能是它编译的原因,但不是你的编译器).但是,现在strcmp采取char const*
(const char*
是同样的事情).将您的函数原型更改为:
int numcmp(char const*, char const*);