转换时条件表达式中的类型不兼容

时间:2015-03-01 16:22:19

标签: c pointers casting conditional-operator kernighan-and-ritchie

我目前正在通过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的想法应该怎么做?

2 个答案:

答案 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,它们都不能隐式转换为其他类型,但您可以自然地将它们自己转换为相同的类型。