2012-05-02 16 views
44

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

#define sqr(X) (X*X) 

लेकिन मैं कुछ इस तरह की जरूरत है:

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

मैं इस काम करने के लिए मिल सकता है?

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

+0

के साथ एक ही समस्या होगी। आप SO को खोजकर आसानी से जवाब प्राप्त कर सकते हैं। जैसे http://stackoverflow.com/questions/4007865/few-questions-about-the-c-preprocessor – CppLearner

+0

विभिन्न विधियां यहां हैं: http://www.parashift.com/c++-faq/macros-with-multi-stmts .html – Ayrat

+0

संबंधित: http://stackoverflow.com/questions/98944/how-to-generate-a-newline-in-a-cpp-macro –

उत्तर

79

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

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

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

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

सावधानी का एक शब्द: सुनिश्चित करें कि \ ** ** आखिरी * * रेखा पर चरित्र। सी में, व्हाइटस्पेस आम तौर पर कोई फर्क नहीं पड़ता, लेकिन इस मामले में, लाइन के अंत में अदृश्य सफेद जगह आपको मार सकती है। – abelenky

+0

@abelenky: अच्छा बिंदु, धन्यवाद। –

+2

किसी को यह जोड़ना चाहिए कि परिणामी पाठ एक पंक्ति पर है। चूंकि सी टोकन के बीच सभी सफेद जगहों का इलाज करता है, लेकिन आमतौर पर इससे कोई फर्क नहीं पड़ता, लेकिन फिर भी। –

11

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

#define sqr(X) \ 
     ((X)*(X)) 
+5

+1: 'x' के आस-पास के ब्रैकेट को याद नहीं करने के लिए! -) – alk

2

आप एक साथ यह भागने से पंक्ति के अंत में न्यू लाइन से बचने के लिए की जरूरत है:

10

कृपया ध्यान दें रूप Kerrek एस.बी. और coaddict ने बताया है, जो स्वीकार किए जाते हैं जवाब में बताया किया जाना चाहिए था, ALWAYS अपने तर्कों के आस-पास जगह ब्रेसिज़ करें। एससीआरसी उदाहरण कॉम्पसी पाठ्यक्रमों में पढ़ाया जाने वाला सरल उदाहरण है।

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

एड एस को 'स्वैप'

+0

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

+0

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

+1

@ गीज़ाटोरक 'वर्ग' (++ i) 'से' ((++ i) * (++ i)) का विस्तार अपरिभाषित व्यवहार का आह्वान करेगा क्योंकि 'i' का मान उस वक्तव्य में एक से अधिक बार संशोधित किया गया है (संचालन के बीच कोई अनुक्रम बिंदु नहीं)। – moooeeeep

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