2015-05-22 5 views
107

js0n.cयह "[0 ... 255] =" सी में वाक्यविन्यास क्या है?

कोड वाक्य रचना की बात कर के रूप में नीचे है:

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 क्या करता है?

उत्तर

107

... जीसीसी

द्वारा

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

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

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; 
+21

एक साथ यह सब डाल कि कोड एक कूद तालिका शायद एक पार्सर के लिए, सूचकांक के लिए ASCII मूल्यों का उपयोग करता है कर रही है। –

+1

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

+0

इसलिए, चूंकि लेबल और चर के अलग-अलग नामस्थान होते हैं, इसलिए पार्सर '&& foo'' का अर्थ है "लेबल 'foo' का नाम' 'foo'' से" अर्थात् 'foo' के पते का पता "? (किसी पते का पता लेना, मुझे विश्वास है, अपरिभाषित व्यवहार, लेकिन यह _is_ वाक्य रचनात्मक रूप से मान्य है।) – dodgethesteamroller

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