मैं डेटा संरचना संचालन को परिभाषित करने के लिए मैक्रोज़ का उपयोग करने की अवधारणा के आसपास अपने सिर को लपेटने की कोशिश कर रहा हूं। निम्नलिखित कोड फ्रीबीएसडी में निर्मित सूची लाइब्रेरी का उपयोग करने के लिए एक सरल उदाहरण है। पुस्तकालय में सभी परिचालन मैक्रोज़ के रूप में परिभाषित किए जाते हैं। मैंने इस दृष्टिकोण को कुछ अन्य पुस्तकालयों में भी देखा है।डेटा संरचनाओं को परिभाषित करने के लिए सी में मैक्रोज़ का उपयोग
मैं देख सकता हूं कि इसमें कुछ फायदे हैं उदाहरण के लिए। सूची में किसी तत्व के रूप में किसी भी डेटा संरचना का उपयोग करने की क्षमता है। लेकिन मुझे समझ में नहीं आता कि यह कैसे काम करता है। उदाहरण के लिए:
stailhead
क्या है? ऐसा लगता है कि "बस" परिभाषित किया गया है।- एक समारोह में
head
औरentries
कैसे पास करें? 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);
}
उचित शीर्षकों पर जाएं और देखें कि 'STAILQ_HEAD',' STAILQ_INIT' –
पर विस्तारित करें या बस 'gcc -E' का उपयोग करें। बीटीडब्ल्यू, मैक्रोज़ का उपयोग करने का यह तरीका सी –
में जेनेरिकों को अनुकरण करने के लिए उपयोगी है, पहली बार, मुझे परिभाषा में STAILQ_HEAD_INITIALIZER का उपयोग करने पर विश्वास है, और बाद में STAILQ_INIT अनावश्यक है। मुझे विश्वास है कि वे वही काम करते हैं। – abelenky