【问题标题】:Incompatible types in conditional expression when casting强制转换时条件表达式中的不兼容类型
【发布时间】:2015-05-01 23:39:39
【问题描述】:

我目前正在完成 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 个参数,但您可以自然地将它们预先转换为相同的类型。
  • Ternary operator的可能重复
  • 我没有使用标准库的 qsort。该声明来自作者编写的函数。定义也在那里。令人惊讶的是,作者在书中使用了第一种方式。而且我想知道这本书中的代码是否太老了以至于不能被 VS 接受,或者我在这里做错了什么。
  • 请注意,如果您将传递的函数指针转换为qsort,则说明您使用错误。 c-faq.com/lib/qsort2.html

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


【解决方案1】:

您的错误是您的自定义比较函数 numcmp 使用了错误的原型。
它应该指向const:

int numcmp(char const *s1, const char *s2); // Showing both equivalent orders for const

条件运算符不能接受参数 2 和 3,它们都不能隐式转换为其他类型,但您可以自然地预先将它们转换为相同的类型。

【讨论】:

  • 很好 - 所以 OP 的问题不是 qsort() 问题,而是 ?: 问题。
【解决方案2】:

在C标准(6.5.15条件运算符)中条件运算符的描述中写道:

3 对于第二个和第三个操作数应满足以下条件之一:- 两个操作数都是指向合格或不合格版本的指针 兼容类型;

兼容的函数应该有兼容的参数。

因为你的函数有指针作为参数然后

2 为了使两种指针类型兼容,两者应相同 限定并且两者都应该是指向兼容类型的指针。

但是这两个函数的参数并不完全相同。

因此编译器是正确的。

【讨论】:

  • 谢谢,就是这样。突然变得非常清晰。作者一定指的是本书前面确实定义的strcmp,并接受了两个char* 参数。在这种情况下不会出错。
  • const 限定符在 K&R 发布“C 编程语言”时不存在。如果将其更新为现代 C,则通过将 const 修饰符添加到它们的参数中,这两个函数都将成为 const 正确的。
猜你喜欢
  • 2017-01-03
  • 1970-01-01
  • 2023-04-05
  • 2021-09-11
  • 2023-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多