स्ट्रक्चर इनिशियलाइज़र में डॉट (।) का क्या अर्थ है?


117
static struct fuse_oprations hello_oper = {
  .getattr = hello_getattr,
  .readdir = hello_readdir,
  .open    = hello_open,
  .read    = hello_read,
};

मैं इस सी वाक्यविन्यास को अच्छी तरह से नहीं समझता। मैं खोज भी नहीं कर सकता क्योंकि मुझे सिंटैक्स का नाम नहीं पता है। वह क्या है?


यह एक स्ट्रक्चर इनिशियलाइज़र की तरह दिखता है।
Mysticial

7
C99 में मानकीकृत, इसलिए यदि आपके पास (वास्तव में) पुराना संकलक है तो काम नहीं करेगा।
कुछ प्रोग्रामर ने '

2
अंत में इसके लिए लिंक मिला: stackoverflow.com/questions/330793/…
मिस्टीरियस नोव

5
दुर्भाग्य से, MSVC के वर्तमान संस्करण भी इस मानक द्वारा '(वास्तव में) पुराने संकलक' हैं।
जोनाथन लेफ्लर

बिल्कुल विचित्र, मैंने इस सवाल को एक फ़्यूज़ ट्यूटोरियल से गुजरते हुए खोजा, और उस एक ही इनिशलाइज़र को लिखते हुए।
कीगन जय

जवाबों:


141

यह एक C99 सुविधा है जो आपको इनिशियलाइज़र में नाम से संरचना के विशिष्ट क्षेत्रों को सेट करने की अनुमति देता है। इससे पहले, इनिशलाइज़र को क्रम में - सभी क्षेत्रों के लिए, बस मूल्यों को समाहित करने की आवश्यकता थी, जो अभी भी काम करता है।

तो निम्न संरचना के लिए:

struct demo_s {
  int     first;
  int     second;
  int     third;
};

...आप उपयोग कर सकते हैं

struct demo_s demo = { 1, 2, 3 };

... या:

struct demo_s demo = { .first = 1, .second = 2, .third = 3 };

...या और भी:

struct demo_s demo = { .first = 1, .third = 3, .second = 2 };

... हालांकि अंतिम दो केवल C99 के लिए हैं।


क्या C + में भी डॉट इनिशियलाइज़ेशन काम करता है? (मुझे इसका परीक्षण करने की आवश्यकता है)
गेब्रियल स्टेपल्स

1
ऐसा प्रतीत होता है कि यह करता है, लेकिन केवल C ++ 20 के लिए, बस दस्तावेज को देख रहा है। यहाँ c के लिए cppreference.com प्रलेखन है (C99 के बाद से काम करता है): en.cppreference.com/w/c/language/struct_initialization , और C ++ के लिए (केवल C ++ 20 के लिए काम करता है): en.cppreference.com/v.cpp / भाषा / समुच्चय_संस्थानीकरण
गेब्रियल स्टेपल्स

ध्यान दें कि मैंने अभी-अभी G ++ का उपयोग करके C ++ के लिए इस "डॉट इनिशियलाइज़ेशन" प्रकार की कोशिश की थी, और ऐसा प्रतीत होता है कि gcc C ++ के सभी संस्करण इसका समर्थन करते हैं, इसलिए मुझे यकीन है कि यह gcc एक्सटेंशन के रूप में gcc द्वारा समर्थित है, जिसका अर्थ है कि C ++ 20 से पहले यह गैर-जीसीसी / जी ++ संकलक के लिए जरूरी पोर्टेबल नहीं है। हालांकि कहा जा रहा है कि, मैं gcc / g ++ कंपाइलर का उपयोग कर रहा हूँ, यदि यह C ++ के लिए gcc द्वारा समर्थित है, तो मैं इसका उपयोग भी कर सकता हूँ।
गेब्रियल स्टेपल्स

डॉट इनिशियलाइज़ेशन में एक संभावित गेटचा है (कम से कम कुछ संकलक के साथ)। struct demo_s demo = { .first = 1, .first = 9 };मेरी जीसीसी में से एक पर इस चेतावनी के बिना संकलित कर देगा और पहले 9. हो जाएगा
Renate


15

इसके रूप में जाना जाता है designated initialisation(देखें आरंभिक नाम )। एक "इनिशलाइज़र-लिस्ट", प्रत्येक ' .' एक " designator" है जो इस मामले fuse_oprationsमें ' hello_oper' पहचानकर्ता द्वारा निर्दिष्ट ऑब्जेक्ट के लिए इनिशियलाइज़ करने के लिए ' ' स्ट्रक्चर के एक विशेष सदस्य का नाम देता है ।


0

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.