2012-04-05 8 views
5

मैं डेटा संरचना संचालन को परिभाषित करने के लिए मैक्रोज़ का उपयोग करने की अवधारणा के आसपास अपने सिर को लपेटने की कोशिश कर रहा हूं। निम्नलिखित कोड फ्रीबीएसडी में निर्मित सूची लाइब्रेरी का उपयोग करने के लिए एक सरल उदाहरण है। पुस्तकालय में सभी परिचालन मैक्रोज़ के रूप में परिभाषित किए जाते हैं। मैंने इस दृष्टिकोण को कुछ अन्य पुस्तकालयों में भी देखा है।डेटा संरचनाओं को परिभाषित करने के लिए सी में मैक्रोज़ का उपयोग

मैं देख सकता हूं कि इसमें कुछ फायदे हैं उदाहरण के लिए। सूची में किसी तत्व के रूप में किसी भी डेटा संरचना का उपयोग करने की क्षमता है। लेकिन मुझे समझ में नहीं आता कि यह कैसे काम करता है। उदाहरण के लिए:

  1. stailhead क्या है? ऐसा लगता है कि "बस" परिभाषित किया गया है।
  2. एक समारोह में head और entries कैसे पास करें?
  3. head किस प्रकार का है, मैं इसे पॉइंटर कैसे घोषित कर सकता हूं?

क्या इस तकनीक के लिए एक मानक नाम है जिसका उपयोग मैं Google, या किसी भी पुस्तक को खोजने के लिए कर सकता हूं जो इस अवधारणा को समझाता है? इस तकनीक के काम के तरीके के बारे में कोई भी लिंक या अच्छी व्याख्या बहुत सराहना की जाएगी।

Niklas B. के लिए धन्यवाद मैं gcc -E भाग गया और इसलिए मुझे लगता है कि head प्रकार struct stailhead की है के लिए stailq_entry

struct stailq_entry { 
int value; 
struct { struct stailq_entry *stqe_next; } entries; 
}; 

के लिए head

struct stailhead { 
    struct stailq_entry *stqh_first; 
    struct stailq_entry **stqh_last; 
} head = { ((void *)0), &(head).stqh_first }; 

और इस इस परिभाषा मिला है।

#include <stdio.h> 
#include <stdlib.h> 
#include <sys/queue.h> 

struct stailq_entry { 
     int value; 
     STAILQ_ENTRY(stailq_entry) entries; 
}; 

int main(void) 
{ 
     STAILQ_HEAD(stailhead, stailq_entry) head = STAILQ_HEAD_INITIALIZER(head); 
     struct stailq_entry *n1; 
     unsigned i; 
     STAILQ_INIT(&head);      /* Initialize the queue. */ 

     for (i=0;i<10;i++){ 
       n1 = malloc(sizeof(struct stailq_entry)); /* Insert at the head. */ 
       n1->value = i; 
       STAILQ_INSERT_HEAD(&head, n1, entries); 
     } 
     n1 = NULL; 

     while (!STAILQ_EMPTY(&head)) { 
       n1 = STAILQ_LAST(&head, stailq_entry, entries); 
       STAILQ_REMOVE(&head, n1, stailq_entry, entries); 
       printf ("n2: %d\n", n1->value); 
       free(n1); 
     } 

     return (0); 
} 
+0

उचित शीर्षकों पर जाएं और देखें कि 'STAILQ_HEAD',' STAILQ_INIT' –

+2

पर विस्तारित करें या बस 'gcc -E' का उपयोग करें। बीटीडब्ल्यू, मैक्रोज़ का उपयोग करने का यह तरीका सी –

+0

में जेनेरिकों को अनुकरण करने के लिए उपयोगी है, पहली बार, मुझे परिभाषा में STAILQ_HEAD_INITIALIZER का उपयोग करने पर विश्वास है, और बाद में STAILQ_INIT अनावश्यक है। मुझे विश्वास है कि वे वही काम करते हैं। – abelenky

उत्तर

7

पहले पकड़ इन मैक्रो करना क्या प्राप्त करने के लिए this पढ़ें। और फिर queue.h पर जाएं। आपको अपना खजाना ट्रोव मिल जाएगा!

मैं के लिए हैं-

#define STAILQ_HEAD(name, type)           \ 
struct name {               \ 
     struct type *stqh_first;/* first element */      \ 
     struct type **stqh_last;/* addr of last next element */   \ 
} 

कुछ सोने के सिक्के पाया चलो थोड़ा गहरे में खुदाई और आपके सवालों

क्या stailhead है का जवाब? ऐसा लगता है कि "बस" परिभाषित किया गया है।

#define STAILQ_HEAD(name, type)           \ 
struct name {               \ 
     struct type *stqh_first;/* first element */      \ 
     struct type **stqh_last;/* addr of last next element */   \ 
} 
STAILQ_HEAD(stailhead, entry) head = 
STAILQ_HEAD_INITIALIZER(head); 
struct stailhead *headp;   /* Singly-linked tail queue head. */ 

तो stailhead

कैसे एक समारोह के लिए सिर और प्रविष्टियों पारित करने के लिए एक संरचना है?

#define STAILQ_ENTRY(type)            \ 
struct {                \ 
     struct type *stqe_next; /* next element */      \ 
} 

तो entries और head (जैसा कि पहले बताया गया है) बस संरचनाएं हैं और आप उन्हें पारित कर सकते हैं बस के रूप में आप अन्य संरचनाओं गुजरती हैं। &structure_variable

किस प्रकार का सिर है, मैं इसे पॉइंटर कैसे घोषित कर सकता हूं?

पहले ही समझाया गया है!

अच्छे सुंदर उदाहरणों के लिए this man page पढ़ें।

+0

'मैन 3 कतार' (स्टैक ओवरफ्लो बनाने के लिए XXX बेवकूफ पैडिंग मेरी टिप्पणी स्वीकार करता है) –

+1

@ConradMeyer धन्यवाद दोस्त। मैंने मैन पेज लिंक जोड़ा! –

+0

धन्यवाद पवन, मुझे जवाब देने के लिए समय लेने के लिए धन्यवाद। आपके उत्तर वास्तव में सहायक हैं। – Raj

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