C एग्रीगेट इनिशियलाइज़र में [N… M] का क्या अर्थ है?


101

से sys.c लाइन 123:

void *sys_call_table[__NR_syscalls] = 
{
    [0 ... __NR_syscalls-1] = sys_ni_syscall,
#include <asm/unistd.h>
};

sys_call_tableसरणियों के लिए एक सामान्य सूचक है, मैं इसे देख सकता हूं। हालांकि क्या है:

[0 ... __NR_syscalls-1]

क्या है ...?


संपादित करें:
मैंने यहां एक और सी चाल सीखी है: प्रीप्रोसेस#include <asm/unistd.h> किया जाएगा और इसकी सामग्री के साथ और इसे सौंपा जाएगा ।[0 ... _NR_syscalls-1]


2
नहीं, यह किसी व्यूह का सूचक नहीं है, यह व्यूअर का एक सरणी है। एक सरणी के लिए एक पॉइंटर घोषित किया जाएगाvoid (*sys_call_table)[__NR_syscalls]
पैट्रिक श्ल्टर

@tristopia आप सही कह रहे हैं। मेरे कहने का मतलब था कि सरणियों के लिए सूचक, इसके समान char *argv[]। फिक्स्ड।
अमुमु

जवाबों:


90

यह डिजाइनिंग इनिशियलाइज़र्स का उपयोग करके इनिशियलाइज़ेशन है

रेंज आधारित इनिशियलाइज़ेशन एक ग्नू जीसीसी एक्सटेंशन है।

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

 int widths[] = { [0 ... 9] = 1, [10 ... 99] = 2, [100] = 3 };

यह पोर्टेबल नहीं है। -pedanticआप के साथ संकलन के साथ ऐसा है।

यह यहाँ कैसे काम करता है?
प्रीप्रोसेसर #include <asm/unistd.h>अपनी वास्तविक सामग्री के साथ बदलता है ( यह विविध प्रतीकात्मक स्थिरांक और प्रकार को परिभाषित करता है, और श्रेणी आधारित निर्माण में विविध कार्यों को घोषित करता है ), जो तब पॉइंटर्स के सरणी को आरंभीकृत करने के लिए आगे उपयोग किया जाता है।


ऐसा लगता है कि यह पोर्टेबल नहीं है। है?
Ivaylo Strandjev

5
@ मेहरदाद Microsoft c कंपाइलर c99 मानक का अनुपालन करता है? मैं यहाँ अपना मामला निश्चिंत करता हूँ ... c99
Aftnix

3
@ मेहरदाद: वास्तव में, डिज़ाइन किए गए शुरुआती का केवल रेंज आधारित निर्माण एक gcc एक्सटेंशन है। समेकित आरंभकर्ता स्वयं C मानक द्वारा अनुमत हैं।
आलोक सेव

2
@ मेहरदाद: क्षमा करें, मैं किसी लौ फाइट का हिस्सा नहीं बनना चाहता, मेरा इरादा केवल एक सूक्ष्म विवरण को स्पष्ट करना था, जिसे मैंने आपको गलत समझा।
आलोक सेव

2
@ मेहरदाद: स्पष्ट होने के लिए, रेंज केवल gcc के लिए पोर्टेबल का निर्माण करती है (और इसके एक्सटेंशन को लागू करने वाले कंपाइलर), और सामान्य रूप से नामित इनिशियलाइज़र केवल उन कंपाइलरों के लिए पोर्टेबल होते हैं जो C99 (या कम से कम उस विशेष सुविधा) का समर्थन करते हैं।
कीथ थॉम्पसन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.