मल्टी लाइन प्रीप्रोसेसर मैक्रोज़


81

मल्टी लाइन प्रीप्रोसेसर मैक्रो कैसे बनाये? मुझे पता है कि एक पंक्ति कैसे बनाई जाती है:

#define sqr(X) (X*X)

लेकिन मुझे ऐसा कुछ चाहिए:

#define someMacro(X)
    class X : public otherClass
    {
         int foo;
         void doFoo();
    };

में इससे कैसे चला सकता हूँ?

यह केवल एक उदाहरण है, वास्तविक मैक्रो बहुत लंबा हो सकता है।


आप एसओ को खोजकर इसका जवाब आसानी से प्राप्त कर सकते हैं। जैसे stackoverflow.com/questions/4007865/…
फॉरवर्ड लर्नर

विभिन्न तरीकों यहां हैं: parashift.com/c++-faq/macros-with-multi-stmts.html
Ayrat

जवाबों:


123

आप \एक लाइन निरंतरता भागने चरित्र के रूप में उपयोग करते हैं।

#define swap(a, b) {               \
                       (a) ^= (b); \
                       (b) ^= (a); \
                       (a) ^= (b); \
                   }

संपादित करें: जैसा कि @abelenky ने टिप्पणियों में बताया, \चरित्र को लाइन पर अंतिम चरित्र होना चाहिए । यदि यह नहीं है (भले ही यह केवल बाद में सफेद जगह है) तो आपको इसके बाद प्रत्येक पंक्ति पर भ्रामक त्रुटि संदेश मिलेंगे।


44
सावधानी का एक शब्द: सुनिश्चित करें कि लाइन पर अंतिम वर्ण है। सी में, व्हाट्सएप आमतौर पर मायने नहीं रखता है, लेकिन इस मामले में, लाइन के अंत में अदृश्य व्हाट्सएप आपको मार सकता है।
अबेलेंकी

2
हालांकि उस पाठ को एक पंक्ति में जोड़ना चाहिए। क्योंकि C टोकन के बीच सभी श्वेत स्थान को एक समान मानता है, जो आमतौर पर ज्यादा मायने नहीं रखता है, लेकिन फिर भी।
पीटर - मोनिका

एक और बात जो मैं करने की सलाह दूंगा वह है ` after all useful lines of the macro, and add a comment afterward saying something like स्थूल के बाद ब्लैंक लाइन की आवश्यकता . It's sometimes easier to ensure that all lines of a macro end with
सुपरकैट

मुझे नहीं पता था कि आप बिटवेअर xor का उपयोग कर सकते हैं जैसे कि चर को स्वैप करने के लिए, लेकिन मुझे लगता है कि मेरे पास यह नहीं था !!!
cmarangu

18

आप \प्रत्येक पंक्ति के अंत में एक बैकस्लैश ( ) लगाकर एक मैक्रो स्पैन कई पंक्तियों बना सकते हैं :

#define F(x) (x)   \
              *    \
             (x)

18

कृपया ध्यान दें कि केरेक एसबी और सह-निर्णय के रूप में इंगित किया गया है, जिसे स्वीकार किए गए उत्तर में बताया जाना चाहिए, हमेशा आपके तर्क के आसपास ब्रेसिज़ रखते हैं। Comprci पाठ्यक्रमों में पढ़ाया जाने वाला सरल उदाहरण sqr उदाहरण है।

यहां समस्या यह है: यदि आप इसे परिभाषित करते हैं कि आपने क्या किया था जब आप "sqr (1 + 5)" कहते हैं? आप "1 + 5 * 1 + 5" या 11 प्राप्त करते हैं
यदि आप सही ढंग से उसके चारों ओर ब्रेसिज़ लगाते हैं, #define sqr(x) ((x)*(x))
तो आपको मिलता है ((1 + 5) * (1 + 5)) या जो हम 36 ... सुंदर चाहते थे।

एड एस में 'स्वैप' के साथ यही समस्या है


कैसे के बारे में sqr(++i)? (मान लें कि हमारे पास एक है int i) :)
गाजा

मैंने इसे एक अभ्यास के रूप में किया था और जाहिरा तौर पर iइसे बढ़ाया जाता है क्योंकि इसे मैक्रो में प्रतिस्थापित किया जाता है (इस मामले में इसे दो बार प्रतिस्थापित किया जाता है), फिर इसे गुणा किया जाता है। तोsqr(++5) == ((7) * (7))
१ivet:

2
@ GézaTörök के विस्तार sqr(++i)के लिए ((++i)*(++i))अपरिभाषित व्यवहार आह्वान की वजह से मूल्य हैं iकि बयान (आपरेशन के बीच कोई अनुक्रम बिंदु) के भीतर एक से अधिक बार संशोधित किया गया है।
मूओइपिप

5

आपको लाइन के अंत में न्यूलाइन से बचकर भागने की आवश्यकता है \:

#define sqr(X) \
        ((X)*(X))
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.