当前位置:  开发笔记 > 编程语言 > 正文

来自K&R C的示例中的指针类型不匹配警告

如何解决《来自K&RC的示例中的指针类型不匹配警告》经验,为你挑选了1个好方法。

虽然您可以隐式地将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.



1> Jared Oberha..:

虽然您可以隐式地将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.

推荐阅读
女女的家_747
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有