सी में आरंभीकरण में वर्गाकार कोष्ठक का क्या अर्थ है?


85
static uint8_t togglecode[256] = {
    [0x3A] CAPSLOCK,
    [0x45] NUMLOCK,
    [0x46] SCROLLLOCK
};

[0x3A]यहाँ का अर्थ क्या है? मैंने केवल कथनों को सीखा हैint a[2] = {1, 2};


सबसे अधिक संभावना है कि यह एक कंपाइलर एक्सटेंशन है जो आपको विशिष्ट सरणी प्रविष्टियों (दिए गए सूचकांकों पर) w / o को शेष में भरने की अनुमति देता है।
एलेक्सी फ्रांज़

जवाबों:


81

इसका अर्थ है सरणी के n -th तत्व को इनिशियलाइज़ करना । आपके द्वारा दिए गए उदाहरण का अर्थ होगा:

togglecode[0x3A] == CAPSLOCK
togglecode[0x45] == NUMLOCK
togglecode[0x46] == SCROLLLOCK

इन्हें "नामित प्रारंभकर्ता" कहा जाता है , और वास्तव में C99 मानक का हिस्सा हैं। हालांकि, इसके बिना वाक्य रचना =नहीं है। उस पेज से:

इसके लिए एक वैकल्पिक वाक्यविन्यास जो कि जीसीसी 2.5 के बाद से अप्रचलित है लेकिन जीसीसी अभी भी स्वीकार करता है [index]कि तत्व मूल्य से पहले लिखना है , नहीं =


41

GCC डॉक्स के अनुसार यह ISO C99 कंप्लेंट है। वे इसे "नामित शुरुआती" के रूप में संदर्भित करते हैं:

एक सरणी इंडेक्स निर्दिष्ट करने के लिए, तत्व मान से पहले `[इंडेक्स] =’ लिखें। उदाहरण के लिए,

 int a[6] = { [4] = 29, [2] = 15 };

के बराबर है

 int a[6] = { 0, 0, 15, 0, 29, 0 };

मैंने इस सिंटैक्स को पहले कभी नहीं देखा है, लेकिन मैंने इसे केवल 4.4.5 gcc के साथ संकलित किया है, साथ-साथ। इसने सफलतापूर्वक संकलित किया और कोई चेतावनी नहीं दी।

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


15

जिसे C99 में पेश किया गया था और इसे एक नामित इनिशियलाइज़र कहा जाता है ।

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

इस विशेष स्थिति में, सरणी इंडेक्स कीबोर्ड स्कैन कोड होते हैं। 0x3aहै # 1 सेट में कोड स्कैन (खंड 10.6 देखें) के लिए CapsLockकुंजी, 0x45है NumLockऔर 0x46 है ScrollLock

ऊपर दिए गए पहले लिंक पर, यह कहा गया है कि:

int a[6] = { [4] = 29, [2] = 15 };

के बराबर है:

int a[6] = { 0, 0, 15, 0, 29, 0 };

दिलचस्प रूप से पर्याप्त है, हालांकि लिंक बताता है कि =आवश्यक है, कि यहां मामला प्रतीत नहीं होता है।


13

यह ( आरंभिक ) नामित शुरुआती के सिंटैक्स , एक C99 सुविधा है।

मूल रूप से, यह एक सरणी के कुछ हिस्सों को इनिशियलाइज़ करता है, उदाहरण के लिए;

int aa[4] = { [2] = 3, [1] = 6 };

सरणी के दूसरे मान को 6 और तीसरे को 3 के रूप में बताता है।

आपके मामले में सरणी ऑफ़सेट हेक्स (0x3a) में होता है जो सरणी के 58'th तत्व को CAPSLOCK के मान से आरंभ करता है जो संभवतः आपके द्वारा दिखाए जा रहे कोड के ऊपर कोड में परिभाषित किया गया है।

बिना आपके कोड के संस्करण =एक विशिष्ट विशिष्ट विस्तार प्रतीत होता है।

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