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

标签 c kernighan-and-ritchie

<分区>

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

关于c - K&R C 示例中的指针类型不匹配警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/665012/

相关文章:

很酷的 GCC 内置插件

无法理解C中减少/增加 'for'的逻辑

c++ - K&R 样式函数定义使用 g++ 编译

c - Printf问题与Kernighan和Ritchie问题1-17

c - K&R - getop() 函数

c++ - 我们如何远程调试Linux服务器上运行的C++应用程序?

c++ - 试图了解 C 预处理器

c - Malloc、free 和段错误

c - K 和 R 练习 1-24

c - k&r练习2-6 "setbits"