C में यह "[0 ... 255] =" सिंटैक्स क्या है?


108

Js0n.c का संदर्भ ले रहे हैं

कोड सिंटैक्स निम्नानुसार है:

    static void *gostruct[] =
    {
        [0 ... 255] = &&l_bad,
        ['\t'] = &&l_loop, [' '] = &&l_loop, ['\r'] = &&l_loop, ['\n'] = &&l_loop,
        ['"'] = &&l_qup,
        [':'] = &&l_loop, [','] = &&l_loop,
        ['['] = &&l_up, [']'] = &&l_down, // tracking [] and {} individually would allow fuller validation but is really messy
        ['{'] = &&l_up, ['}'] = &&l_down,
        ['-'] = &&l_bare, [48 ... 57] = &&l_bare, // 0-9
        [65 ... 90] = &&l_bare, // A-Z
        [97 ... 122] = &&l_bare // a-z
    };

........
.......

l_bad:
    *vlen = cur - json; // where error'd
    return 0;

........
........

क्या कोई समझा सकता है कि यहां क्या किया जा रहा है? वाक्य रचना [0 ... 255]और &&l_badयहाँ क्या करता है?

जवाबों:


109

... जीसीसी द्वारा प्रदान किया गया एक एक्सटेंशन है

https://gcc.gnu.org/onlinedocs/gcc/Designated-Inits.html#Designated-Inits

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

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

&& एक और विस्तार है

https://gcc.gnu.org/onlinedocs/gcc/Labels-as-Values.html#Labels-as-Values

आप एकतरफा ऑपरेटर के साथ वर्तमान फ़ंक्शन (या युक्त फ़ंक्शन) में परिभाषित लेबल का पता प्राप्त कर सकते हैं &&। मान का प्रकार है void *। यह मान एक स्थिरांक है और इसका उपयोग उस प्रकार से किया जा सकता है जहाँ कोई भी स्थिरांक मान्य है। उदाहरण के लिए:

 void *ptr;
 /* ... */
 ptr = &&foo;

22
यह सब एक साथ डालते हुए कोड जंप टेबल बना रहा है, जो सूचकांकों के लिए एससीआई मानों का उपयोग करता है, संभवतः एक पार्सर के लिए।
शाफ़्ट

1
विशेष रूप से एक JSON पार्सर, जहां तक ​​मैं बता सकता हूं।
केविन

1
@ केविनएम जो समझ में आता है। एक संचालक के पते-संचालक (&) को लागू करने के लिए एक वाक्यविन्यास त्रुटि कब हुई? मैं C99 में अनुमान लगा रहा हूं, शायद? पिछली बार जब मैंने विजुअल C ++ का नियमित रूप से उपयोग किया था, जो 1998 के आसपास था, जो पहले C99 ANSI मानक होता था, और कंपाइलर ने तब इसकी अनुमति दी थी (मुझे पता है क्योंकि मुझे याद है कि &उत्पादन कोड में एक डबल-अप टाइपो हो रहा है!)।
dodgethesteamroller

3
@dodgethesteamroller &&एक पूरी तरह से अलग टोकन है &, इसलिए कोई भी तरीका नहीं है जो मानक सी व्याकरण &&x"एक्स के पते का पता" के रूप में व्याख्या कर सकता है, भले ही मूल्य श्रेणी का हो &x
तवियन बार्न्स

4
@dodgethesteamroller: --हमेशा के रूप में पार्स किया जाता है --, और &&हमेशा के रूप में पार्स किया जाता है &&। C99 pro6.4¶4: अगला प्रीप्रोसेसिंग टोकन वर्णों का सबसे लंबा अनुक्रम है जो एक प्रीप्रोसेसिंग टोकन का गठन कर सकता है
नवजाल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.