2017-02-01 14 views
5

मैं ग्लिब कोड देख रहा था। Glibc की कतार के कुछ कोड मेरा ध्यान पकड़ा। मैं इस संरचना परिभाषा का अर्थ नहीं दे सका। इस संरचना का नाम नहीं है। क्यूं कर? यह कैसे काम करता है?सी प्रोग्रामिंग # परिभाषित संरचना {} घोषित

#define LIST_ENTRY(type)      \ 
struct {        \ 
    struct type *le_next; /* next element */   \ 
    struct type **le_prev; /* address of previous next element */ \ 
} 

Source

+1

एक टेम्पलेट के लिए एक विकल्प की तरह दिखता है। – chris

+3

कई मामलों में मैक्रोज़ एक्सप्रेस * आंशिक * कोड। पूर्ण निर्माण देखने के लिए कोड में बाद में यह मैक्रो * उपयोग * कैसे किया जाता है देखें। वहां, मुझे यकीन है, आप लापता नाम और यह आवश्यक सभी देखेंगे। – AnT

+0

ध्यान दें कि आपके द्वारा संदर्भित हेडर उपयोग दस्तावेज़ों के लिए लोगों को [कतार '(3)] (http://man7.org/linux/man-pages/man3/queue.3.html) के लिए मैन्युअल पृष्ठ पर निर्देशित करता है। क्या आपने उस पृष्ठ को पढ़ा? यह वास्तव में इस मैक्रो और अन्य लोगों के लिए स्पष्टीकरण, उपयोग निर्देश, और उदाहरण कोड देता है। –

उत्तर

10

कि वास्तव में एक पूर्वप्रक्रमक मैक्रो, कि विस्तारित किया जा सकता है (संभवत: अनुगामी नाम के साथ) कहीं और है।

कि हेडर फाइल के शुरू में टिप्पणी में और अधिक विवरण अन्य मैक्रो शामिल queue(3) man page के लिए एक संदर्भ है:

मैक्रो LIST_ENTRY एक संरचना सूची में तत्वों जोड़ता है वाणी ।

और उपयोग का एक उदाहरण:

LIST_HEAD(listhead, entry) head = LIST_HEAD_INITIALIZER(head); 
struct listhead *headp;     /* List head. */ 
struct entry { 
    ... 
    LIST_ENTRY(entry) entries;  /* List. */ 
    ... 
} 
*n1, *n2, *n3, *np, *np_temp; 

LIST_INIT(&head);      /* Initialize the list. */ 

n1 = malloc(sizeof(struct entry));  /* Insert at the head. */ 
LIST_INSERT_HEAD(&head, n1, entries); 

इस सी कोड (नहीं सी ++) होने के नाते, और सी की कमी होती है टेम्पलेट्स, इस पूर्वप्रक्रमक मैक्रो टेम्पलेट्स "अनुकरण" करने के लिए इस्तेमाल किया जा सकता है (ध्यान दें type पैरामीटर)।

+0

टिप्पणियों के लिए धन्यवाद, उपयोग के बेहतर और अधिक पूर्ण उदाहरण प्रदान करने के लिए संपादित किया गया। – roalz

+0

@LightnessRacesinOrbit प्रश्न संपादित करने के बाद मेरी टिप्पणी अब समझ में नहीं आया, इसलिए मैंने इसे हटा दिया। – unwind

+0

@epoxxy अगर यह आपकी मदद करता है, तो कृपया – roalz

8

यह एक मैक्रो है जिसका उपयोग एक संरचना प्रकार घोषित करने के लिए किया जाता है, next और prev पॉइंटर्स के साथ दूसरे संरचना प्रकार के उदाहरणों के लिए। यही कारण है कि दूसरे प्रकार एक माता पिता के प्रकार हो सकता है, तो आप एक "लिंक करने योग्य struct" इस तरह बना सकते हैं: संकेत के साथ

struct foo { 
    LIST_ENTRY(foo) list; 
    int value; 
}; 

यह एक struct foo एक सदस्य list जो बारी में सवाल में संरचना है कहा जाता युक्त बनाता है, struct foo पर इशारा करते हुए।

अब हम तो जैसे struct foo रों का एक छोटा लिंक्ड सूची बना सकते हैं:

struct foo fa, fb; 
fa.value = 47; 
fa.list.le_next = &fb; 
fa.list.le_prev = NULL; 
fb.value = 11; 
fb.list.le_next = NULL; 
fb.list.le_prev = &fa.list.le_next; 

मैं 100% अंतिम पंक्ति बारे में निश्चित नहीं हूँ, लेकिन मुझे लगता है कि यह एक तरह से समझ में आता है।

+1

चूंकि आपने 'struct foo' में सूची सदस्य को पहचानकर्ता 'सूची' दिया है, इसलिए आपको' fa.le_next' (और इसी तरह 'le_prev') के बजाय' fa.list.le_next' का उपयोग करना होगा। हालांकि, आप सूची सदस्य को इसे 'LIST_ENTRY (foo)' घोषित करके अज्ञात बना सकते हैं, और फिर आप 'fa.le_next' और' fa.le_prev' तक पहुंच सकते हैं। –

+0

@IanAbbott धन्यवाद! निश्चित रूप से निश्चित। ओएमजी, अज्ञात सदस्य सी 11 नहीं हैं? :) – unwind

+0

ध्यान दें कि sys/quque.h मैक्रोज़ के साथ/निकालने/निकालने के लिए भी आता है।ऐसी सूची से (http://man7.org/linux/man-pages/man3/queue.3.html पर प्रलेखित) – nos

संबंधित मुद्दे