Possible Duplicate:
Problem compiling K&R example
最近我一直在研究 K&R 的 C 编程语言。
在第 5.11 节中,他们介绍了指向函数的指针,并且在键入他们的示例后——一个快速排序实现,我们在其中提供了一个指向我们要使用的比较函数的指针——我从编译器收到警告:指针类型不匹配在条件表达式中。 (我的编译器是 OS X 10.5.6 上的 gcc 4.0.1)
示例中触发警告的行是:
qsort((void **) lineptr, 0, nlines-1,
(int (*)(void*, void*))(numeric ? numcmp : strcmp));
程序执行时没有出现段错误,但我喜欢消除所有可能出现的警告,或者至少了解它们的原因。
numcmp 的函数声明如下:
int numcmp(char *, char *);
但是根据联机帮助页,stcmp 具有以下签名:
int strcmp(const char *s1, const char *s2);
由于方法签名略有不同,警告是否简单?忽略警告的后果是什么?
虽然您可以将 char* 隐式转换为 void*,但您不能对具有这些类型的函数指针执行相同的操作(没有警告)。编译器对函数签名的类型匹配更加谨慎。
更不用说 qsort 内部发生的事情是相反的:也就是说,void* 将在 numcmp 中转换为 char*,在 strcmp 中转换为 const char*。
编译器应该在这些情况下发出警告。如果您真的必须使用与参数类型不同的函数,也许您应该使用与类型匹配的包装函数,然后在调用原始函数时进行适当的显式转换。
例如:
static int strcmp_wrapper(void* s1, void* s2) {
return strcmp((char*)s1, (char*)s2);
}
static int numcmp_wrapper(void* n1, void* n2) {
return numcmp((char*)n1, (char*)n2);
}
qsort((void **) lineptr, 0, nlines-1,
(numeric ? numcmp_wrapper : strcmp_wrapper));
qsort 的现代签名是
void
qsort(void *base, size_t nel, size_t width,
int (*compar)(const void *, const void *));
const
的问题似乎没有在您的问题中发挥作用,但 K&R 没有 const
。