سؤال

لدي مشكلة مع scandir():على manpage يحتوي هذا النموذج:

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

مترجم دول مجلس التعاون الخليجي-4.3.2, ، CFLAGS هي التالية:

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

ما هو معنى هذا التحذير ؟ إعلان RubyCompare تبدو صحيحة بالنسبة لي إلى جانب تحذير الكود يعمل تماما.

هل كانت مفيدة؟

المحلول

في الواقع, ليس هناك مثل هذا القيد أنه لا يمكنك تمرير مؤشر إلى كائن سطري وظيفة.مضمنة الكلمة سوى إشارة إلى المترجم إلى مضمنة المكالمات عندما يمكن.

المشكلة هي أن manpage على 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 مقارنة وظيفة:

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

نصائح أخرى

هذا النموذج قد تغير الواقع في النسخة الأخيرة من جنو libc تعكس POSIX القياسية.

إذا كان لديك التعليمات البرمجية التي تريد العمل على قانون جديد ، ثم استخدم __سي العمومية_PREREQ الماكرو شيء مثل

#define USE_SCANDIR_VOIDPTR 
#if defined( __GLIBC_PREREQ  )
# if  __GLIBC_PREREQ(2,10)
#  undef USE_SCANDIR_VOIDPTR
# endif
#endif

#ifdef USE_SCANDIR_VOIDPTR
 static int RubyCompare(const void *a,  const void *b)
#else 
 static int RubyCompare(const struct dirent **a,  const struct dirent **b)
#endif

...

كنت يعطي مؤشر إلى كائن سطري وظيفة ؟ وهذا لا معنى له في الواقع لا عجب أنه حتى يجمع مع تحذير.

تحرير:كريس أعلاه هو الحق ، مضمنة الكلمة هو فقط تجاهل بصمت عندما لا معنى له / لا ينطبق.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top