我目前正在通过K& R练习,而且还有一些让我烦恼的事情。
我有qsort
函数声明:
void qsort(void *v[], int left, int right,
int (*comp)(void *, void *));
根据这本书,我应该能够使用条件表达式来选择比较函数。我有两个:
int numcmp(char *s1, char *s2)
和cstring'
int strcmp(const char *s1, const char *s2);
电话看起来像是:
qsort((void **)lineptr, 0, nlines - 1,
(int(*)(void *, void *))(numeric ? numcmp : strcmp));
我的MS VS给了我一个错误:
Error: operand types are incompatible
然而,当我这样做时:
qsort((void **)lineptr, 0, nlines - 1,
(numeric ? (int(*)(void *, void *))numcmp : (int(*)(void *, void *))strcmp));
一切都好。
这本书是错的,还是只是VS的想法应该怎么做?
答案 0 :(得分:4)
在C标准(6.5.15条件运算符)中的条件运算符的描述中,写有:
3以下其中一项适用于第二和第三个操作数: - 两个操作数都是指向合格或非限定版本的指针 兼容类型;
兼容功能应具有兼容的参数。
由于你的函数有指针作为参数,所以
2要使两个指针类型兼容,两者应完全相同 限定,两者都是兼容类型的指针。
然而,这两个函数的参数不相同。
因此编译器是正确的。
答案 1 :(得分:1)
您的错误是使用自定义比较函数numcmp
的错误原型
它应该指向const
:
int numcmp(char const *s1, const char *s2); // Showing both equivalent orders for const
条件运算符不能接受参数2和3,它们都不能隐式转换为其他类型,但您可以自然地将它们自己转换为相同的类型。