编译 K&R 示例时出现问题

2023-12-07

我在编译本书第 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) {
    /* ... */
}

问题是代码无法编译(我正在使用数字火星编译器)。我得到的错误是这样的:

        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 有两个指向非常量字符的指针(char *)我认为(这可能是它当时编译的原因,但不是用你的编译器编译的)。然而,现在 strcmp 需要char const* (const char*是同一件事)。将您的函数原型更改为:

int numcmp(char const*, char const*);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

编译 K&R 示例时出现问题 的相关文章

随机推荐