c - जब हम एक मैक्रो परिभाषित करते हैं तो(0) का उपयोग करने का क्या उपयोग होता है?




macros linux-kernel (2)

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

थोड़ी देर के बिना (0), ऊपर आपका कोड काम नहीं करेगा

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

चूंकि मैक्रो के बाद अर्धविराम अन्य खंड "खाएगा", और उपर्युक्त संकलन भी नहीं करेगा।

संभावित डुप्लिकेट:
सी / सी ++ मैक्रोज़ में क्या करें और अगर-और बयान

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

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

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


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

मान लें कि आपने कुछ ऐसा किया है:

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 पर और स्पष्टीकरण http://developer.apple.com/documentation/DeveloperTools/gcc-4.0.1/cpp/Swallowing-the-Semicolon.html#Swallowing-the-Semicolon





linux-kernel