2009-05-29 27 views
113

संभव डुप्लिकेट:
Do-While and if-else statements in C/C++ macrosजब हम मैक्रो को परिभाषित करते हैं तो 0 (0) का क्या उपयोग होता है?

मैं लिनक्स कर्नेल पढ़ रहा हूँ और मैं इस तरह कई मैक्रो पाया:

#define INIT_LIST_HEAD(ptr) do { \ 
    (ptr)->next = (ptr); (ptr)->prev = (ptr); \ 
} while (0) 

क्यों वे परिभाषित के बजाय इस का उपयोग करते हैं यह बस एक {} में?

उत्तर

131

आप इसे अर्धविराम के साथ अनुसरण कर सकते हैं और इसे एक फ़ंक्शन की तरह दिखने और कार्य करने के लिए कर सकते हैं। यह तब भी काम करता है जब/ठीक है तो क्लॉज ठीक से।

जबकि बिना (0), ऊपर अपने कोड

if (doit) 
    INIT_LIST_HEAD(x); 
else 
    displayError(x); 

साथ काम करेंगे नहीं के बाद से मैक्रो के बाद अर्धविराम "खाने" और खंड होता है, और इसके बाद के संस्करण भी संकलन नहीं होगा।

+5

लेकिन ओ पी के सवाल खड़ा है। क्यों {{ptr) -> अगला ...} करने के बजाय {{ptr) -> अगला ...} जबकि (0) ;? –

+26

अरनो ने समझाया। यह "{(पीआरटी) -> अगला ...} तक विस्तारित होगा;" इस प्रकार, एक बयान के बाद एक बयान। अगर वाक्यविन्यास हालांकि "अगर (अभिव्यक्ति) कथन अन्य कथन है"। अन्य किसी भी से जुड़े नहीं होंगे, क्योंकि आपने "अगर (अभिव्यक्ति) कथन कथन" लिखा होगा (एक "{...}" और एक ";" कथन)। –

+3

जैसा कि आमो ने कहा, यह एक चालाक चाल है जो एक मैक्रो को * सी * कथन के लिए अनुमति देता है जो अर्धविराम से समाप्त होना चाहिए। यह मैक्रो अधिनियम को फ़ंक्शन कॉल की तरह बनाता है, जहां तक ​​कथन निर्माण और समाप्ति (';' के साथ) का संबंध है। – Eddie

41

यह आपको एक मैक्रो में कई कथन समूहबद्ध करने की अनुमति देता है।

मान लें आप की तरह कुछ किया:

if (foo) 
    INIT_LIST_HEAD(bar); 

तो मैक्रो encapsulating के बिना परिभाषित किया गया था कर {...} जबकि (0) ;, ऊपर कोड

if (foo) 
    (bar)->next = (bar); 
    (bar)->prev = (bar); 

का विस्तार होगा यह स्पष्ट रूप से नहीं है कि क्या इरादा था, क्योंकि फू धारण होने पर केवल पहला कथन निष्पादित किया जाएगा। दूसरा कथन निष्पादित किया जाएगा चाहे फू रखता है या नहीं।

संपादित करें: इसके अलावा स्पष्टीकरण http://c-faq.com/cpp/multistmt.html पर और http://developer.apple.com/documentation/DeveloperTools/gcc-4.0.1/cpp/Swallowing-the-Semicolon.html#Swallowing-the-Semicolon

+7

यह डू की व्याख्या नहीं करता है .. जबकि (0) मैक्रो का हिस्सा, बस {} ब्रेसिज़ का उपयोग। – SPWorley

+0

करें {} जबकि (0) भाग में भाग समझाया गया है, यह एक है। – adobriyan

+1

एसपीडॉर्ली, एडोब्रिया: दरअसल, ऐसा लगता है कि इस पोस्ट के लेखक ने {} जबकि (0) को समझाते हुए लिंक जोड़े हैं। – Jamer

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