سؤال

أنا أستخدم بنية قائمة GLib المرتبطة بشكل مزدوج، GList.أود أن أعرف إذا كان هناك أي معيار ماكرو للتكرار عبر قائمة GList.لم أتمكن من العثور على أي شيء من هذا القبيل في وثائق GLib.ونتيجة لذلك، قمت بإنشاء وحدة الماكرو الخاصة بي، لكنني أفضل استخدام شيء قياسي إذا كان موجودًا.

لتوضيح المسألة:عادةً ما أكتب الكثير من التعليمات البرمجية التي تبدو كما يلي:

GList *list, *elem;
MyType *item;

for(elem = list; elem; elem = elem->next) {
  item = elem->data;
  /* do something with item */
}

مع الماكرو يمكن تخفيضه إلى

GList *list;
MyType *item;

GFOREACH(item, list) {
  /* do something with item */
}

وهو أقل صاخبة بكثير.


ملحوظة:أدركت أن GLib يوفر وظيفة foreach للتكرار عبر قائمة واستدعاء رد اتصال لكل عنصر، ولكن غالبًا ما يؤدي الاتجاه غير المباشر لرد الاتصال إلى جعل قراءة التعليمات البرمجية أكثر صعوبة، خاصة إذا تم استخدام رد الاتصال مرة واحدة فقط.


تحديث:نظرًا لعدم وجود ماكرو قياسي، فأنا أضع الماكرو الذي أستخدمه هنا في حالة ما إذا كان مفيدًا لشخص آخر.التصحيحات / التحسينات هي موضع ترحيب.

#define GFOREACH(item, list) for(GList *__glist = list; __glist && (item = __glist->data, true); __glist = __glist->next)
هل كانت مفيدة؟

المحلول

لا يوجد مثل هذا الماكرو.

عادةً ما أستخدم أ for Loop كما في المثال الخاص بك ما لم تمتد العملية لأكثر من خمسة عشر سطرًا، على سبيل المثال، وفي هذه الحالة عادةً ما أجد أن وظيفة foreach الإضافية ذات الاسم الوصفي أكثر قابلية للقراءة من البديل.

ما قد لا تدركه هو أنه ليس عليك بالضرورة كتابة دالة foreach الخاصة بك:

g_list_foreach(list, (GFunc)g_free, NULL);

يحرر كل عنصر في القائمة، وهي عملية أستخدمها غالبًا.

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