2012-03-29 10 views
6
55 typedef struct pidmap { 
56   atomic_t nr_free; 
57   void *page; 
58 } pidmap_t; 
59 
60 static pidmap_t pidmap_array[PIDMAP_ENTRIES] = 
61   { [ 0 ... PIDMAP_ENTRIES-1 ] = { ATOMIC_INIT(BITS_PER_PAGE), NULL } }; 

पर कोड स्निपेट ऊपर दिए गए कोड स्निपेट को लिनक्स कर्नेल स्रोत में मिले एक स्ट्रक्चर की सरणी के प्रारंभिकरण को दिखाता है जो ऊपर दिए गए कोड स्निपेट को दिखाता है। मैंने पहले कभी शुरूआत के इस रूप को नहीं देखा है और मैं खुद ही एक ही चीज का अनुकरण नहीं कर सका। मैं वास्तव में क्या याद कर रहा हूँ?लिनक्स कर्नेल स्रोत

Source of the code

+3

क्यों एक सी ++ टैग है? लिनक्स कर्नेल सी ++ का उपयोग नहीं करता है। – ThiefMaster

+0

एक विस्तार सुविधा होना चाहिए। – iammilind

+0

लिनक्स कर्नेल बहुत सारे जीसीसी विशिष्ट एक्सटेंशन का उपयोग करता है। उदाहरण देखें http://gcc.gnu.org/onlinedocs/gcc-4.6.3/gcc/index.html#toc_C- एक्सटेंशन –

उत्तर

6

यह एक जीएनयू/जीसीसी एक्सटेंशन है जिसे नामित प्रारंभिक कहा जाता है। आप GCC documentation में इसके बारे में अधिक जानकारी प्राप्त कर सकते हैं।

उसी मान पर तत्वों की एक श्रृंखला शुरू करने के लिए, [first ... last] = value लिखें। यह एक जीएनयू एक्सटेंशन

+2

बस सटीकता के लिए, नामित प्रारंभकर्ता एक जीसीसी एक्सटेंशन नहीं हैं ([यह प्रश्न देखें ] (http://stackoverflow.com/questions/9849719/what-do-square-brackets-mean-in-array-initialization-in-c)), लेकिन रेंज वाक्यविन्यास है। – huon

5

यह एक Designated Initializer का उपयोग करके किया जाता है।

यह एक जीसीसी विस्तार है और मानक सी निर्माण नहीं है। इसका उपयोग गैर पोर्टेबल कोड में होता है, इसलिए ऐसे कंपाइलर एक्सटेंशन का उपयोग करने से बचें जब तक पोर्टेबिलिटी आपकी चिंताओं का कम से कम न हो।

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