GCC 7.3 - 3.10.3. Swallowing the Semicolon

3.10.3 अर्धविराम को निगलते हुए




gcc

3.10.3 अर्धविराम को निगलते हुए

अक्सर एक मैक्रो को परिभाषित करना वांछनीय है जो एक यौगिक बयान में फैलता है। उदाहरण के लिए, निम्नलिखित मैक्रो, जो एक पॉइंटर को आगे बढ़ाता है (तर्क p कहता है कि इसे कहां ढूंढना है) व्हॉट्सएप पर देखें:

#define SKIP_SPACES(p, limit)  \
{ char *lim = (limit);         \
  while (p < lim) {            \
    if (*p++ != ' ') {         \
      p--; break; }}}

यहाँ बैकस्लैश-न्यूलाइन का उपयोग मैक्रो परिभाषा को विभाजित करने के लिए किया जाता है, जो कि एक एकल तार्किक रेखा होनी चाहिए, ताकि यह उस तरह से समानता रखता हो जैसे कि मैक्रो परिभाषा का हिस्सा नहीं होने पर इस तरह का कोड बाहर रखा जाएगा।

इस मैक्रो को कॉल SKIP_SPACES (p, lim) हो सकता है। कड़ाई से बोलते हुए, कॉल एक यौगिक बयान तक फैलता है, जो एक पूर्ण बयान है, जिसे समाप्त करने के लिए अर्धविराम की आवश्यकता नहीं है। हालाँकि, चूंकि यह एक फ़ंक्शन कॉल की तरह दिखता है, इसलिए यह भ्रम को कम करता है यदि आप इसे फ़ंक्शन कॉल की तरह उपयोग कर सकते हैं, बाद में अर्धविराम लिखना, जैसा कि SKIP_SPACES (p, lim);

इससे बयानों से पहले परेशानी हो सकती है, क्योंकि अर्धविराम वास्तव में एक अशक्त कथन है। मान लीजिए आप लिखते हैं

if (*p != 0)
  SKIP_SPACES (p, lim);
else …

दो बयानों की उपस्थिति- यौगिक स्टेटमेंट और एक अशक्त कथन - if स्थिति और else बीच में अमान्य C कोड बनाता है।

SKIP_SPACES करते समय मैक्रो SKIP_SPACES की परिभाषा को इस समस्या को हल करने के लिए बदला जा सकता है। यहां कैसे:

#define SKIP_SPACES(p, limit)     \
do { char *lim = (limit);         \
     while (p < lim) {            \
       if (*p++ != ' ') {         \
         p--; break; }}}          \
while (0)

अब SKIP_SPACES (p, lim); में फैलता है

do {…} while (0);

जो एक कथन है। लूप बिल्कुल एक बार निष्पादित होता है; अधिकांश संकलक इसके लिए कोई अतिरिक्त कोड नहीं बनाते हैं।

अगला: साइड इफेक्ट्स का दोहराव , पिछला: ऑपरेटर की पूर्ववर्ती समस्याएं , ऊपर: मैक्रो नुकसान [ Contents ] [ Index ]