2010-06-10 7 views
39
struct file_operations scull_fops = { 
.owner = THIS_MODULE, 
.llseek = scull_llseek, 
.read = scull_read, 
.write = scull_write, 
.ioctl = scull_ioctl, 
.open = scull_open, 
.release = scull_release, 
}; 

इस घोषणा मानक सी में चिह्नित संरचना प्रारंभ सिंटैक्स का उपयोग करता।टैग की गई संरचना प्रारंभिक वाक्यविन्यास क्या है?

क्या कोई विस्तार कर सकता है?

+4

मैं एक ही पुस्तक पढ़ रहा हूं –

+1

मैं उसी पुस्तक को – Lewisou

+0

पर पढ़ रहा हूं, मैं भी वही पुस्तक पढ़ रहा हूं :) –

उत्तर

4

आप संरचना शुरू करने के लिए संरचना के सदस्यों के नामों का उपयोग कर रहे हैं। यानी प्रत्येक सदस्य प्रारंभिकता उस सदस्य के नाम से "टैग की गई" है।

69

जब आप "पारंपरिक" एएनएसआई सी भाषा (सी 8 9/9 0) में कुल प्रारंभिक (में प्रारंभकर्ता) का उपयोग करते हैं, तो आपको पहले से शुरू होने के क्रम में प्रत्येक संरचना सदस्य के लिए एक व्यक्तिगत प्रारंभकर्ता प्रदान करना होगा। उदाहरण

struct S { int a, b, c, d; }; 

struct S s = { 1, 2, 3, 4 }; 
/* 1 for `s.a`, 2 for `s.b` and so on... */ 

के लिए आप सभी सदस्यों के लिए initializers निर्दिष्ट करने के लिए आवश्यक नहीं हैं, यानी आप किसी भी समय बंद कर सकते हैं (शेष सदस्य होंगे शून्य प्रारंभ)।

किसी कारण आप केवल स्पष्ट संरचना के तीसरे सदस्य प्रारंभ करने में परवाह के लिए, आप पहले और दूसरे सदस्यों के लिए "डमी" स्पष्ट initializers आपूर्ति करने के लिए था (बस वांछित तीसरे को पाने के लिए)

/* We only care to explicitly initialize `s.c` */ 
struct S s = { 0, 0, 3 }; 
/* but we have to explicitly initialize `s.a` and `s.b` as well */ 

या विशिष्ट आरंभीकरण परित्याग पूरी तरह से (संभावना सामान्य = { 0 } और इसकी जगह) और विशिष्ट सदस्यों के लिए बाद में एक काम का उपयोग

struct S s = { 0 }; 
s.c = 3; 

इस असाइनमेंट आधारित दृष्टिकोण का एक उल्लेखनीय लाभ यह है कि यह स्वतंत्र है struct S की घोषणा में सदस्य c की स्थिति से।

सी भाषा (C99) के नए विनिर्देश आप {}

struct S s = { .c = 3 }; 

भीतर इस तरह वांछित सदस्य नाम की आपूर्ति करके उपयोग करने के लिए "टैग" initializers आप केवल स्पष्ट रूप से वांछित सदस्य (सदस्यों) को प्रारंभ (अनुमति देता है और संकलक शून्य को शुरू करने के लिए बाकी है)। यह न केवल आपको कुछ टाइपिंग बचाता है बल्कि कुल आरंभकर्ताओं को उस क्रम से स्वतंत्र बनाता है जिसमें सदस्यों को संरचना प्रकार की घोषणा में निर्दिष्ट किया जाता है।

कुल आरंभकर्ता, जैसा कि आप शायद जानते हैं, भी सरणी के साथ उपयोग किया जा सकता है। और सी 99 एरे के साथ "टैग" प्रारंभिकरण का भी समर्थन करता है। कैसे एक सरणी के मामले में "टैग" देखो निम्न उदाहरण के रूप में रेखांकित किया गया है

int a[10] = { [5] = 3 }; 
/* `a[5]` is initialized with 3, the rest of `a` is zero-initialized */ 

यह एक बार और कि सी भाषा "सब कुछ या कुछ" दृष्टिकोण से चिपक प्रारंभ एकत्र करने के लिए जारी है ध्यान देने योग्य है: अगर आप संरचना या सरणी के केवल एक (या कुछ) सदस्यों के लिए एक स्पष्ट प्रारंभकर्ता निर्दिष्ट करते हैं, संपूर्ण योग प्रारंभ होता है, और स्पष्ट प्रारंभकर्ताओं के बिना सदस्यों को शून्य-प्रारंभिक प्राप्त होता है।

+0

टैग की गई शुरुआत प्रारंभिक रूप से सी ++ में समर्थित नहीं है। केवल अनुक्रम शैली समर्थित है। महान उत्तर के लिए – ShitalShah

+0

@ एएनटी +1। –

1

इस प्रकार के प्रारंभिकरण के संबंध में उल्लेखनीय एक अन्य लाभ यह है कि यह संरचना सदस्यों के पुनर्गठन की अनुमति देता है, जो कि कुछ मामलों में प्रदर्शन सुधार कर सकता है, उदाहरण के लिए, पॉइंटर्स को उसी हार्डवेयर कैश लाइन में अक्सर एक्सेस किए गए सदस्यों को रखने के लिए।

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