当前位置:  开发笔记 > 后端 > 正文

Manpage scandir()原型怪异

如何解决《Manpagescandir()原型怪异》经验,为你挑选了1个好方法。

我有scandir()的问题:联机帮助页包含这个原型:

int scandir(const char *dir, struct dirent ***namelist,
  int (*filter)(const struct dirent *),
  int (*compar)(const struct dirent **, const struct dirent **));

所以我有这个:

static inline int
RubyCompare(const struct dirent **a,
  const struct dirent **b)
{
  return(strcmp((*a)->d_name, (*b)->d_name));
}

这是电话:

num = scandir(buf, &entries, NULL, RubyCompare);

最后,编译器说:

warning: passing argument 4 of ‘scandir’ from incompatible pointer type

编译器是gcc-4.3.2,我的CFLAGS如下:

-Wall -Wpointer-arith -Wstrict-prototypes -Wunused -Wshadow -std=gnu99

这个警告是什么意思?RubyCompare的声明看起来对我来说是正确的,除了警告代码完全可行.



1> Chris Young..:

实际上,没有这样的约束,你不能将指针传递给内联函数.inline关键字仅作为编译器提示内联调用的提示.

问题是scandir()的联机帮助页有点误导.第4个参数的原型实际上是int(*cmp)(const void*,const void*).

因此,您需要更改代码,如下所示:

static inline int RubyCompare(const void *a, const void *b)
{
    return(strcmp((*(struct dirent **)a)->d_name, 
                  (*(struct dirent **)b)->d_name));
}

我不确定你为什么写这个函数,因为你可以使用提供的alphasort compare函数:

num = scandir(buf, &entries, NULL, alphasort);

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