2010-01-22 9 views
7

सी/सी ++ मैक्रोज़ के साथ स्वचालित रूप से लंबी संरचनाओं को उत्पन्न करना काफी आसान है। उदाहरण के लिए, मैं तरीकों कभी अपवाद (COM-सामने आ तरीकों के लिए जरूरी) फेंक नहीं करने के लिए मैं कुछ इस तरह कर सकते हैं का एक विशाल सेट चाहते हैं:मैं मैक्रो विस्तार परिणाम में प्रीप्रोसेसर डालने लाइनब्रेक्स कैसे बना सकता हूं?

#define BEGIN_COM_METHOD\ 
    try{ 

#define END_COM_METHOD\ 
    return S_OK;\ 
    } catch(exception&) {\ 
     // set IErrorInfo here\ 
     return E_FAIL;\ 
    } 

इस तरह के मैक्रो प्रबंधनीय एक "\" का उपयोग कर सकते बनाने के लिए मैक्रो परिभाषा multiline और अधिक पठनीय बनाने के लिए चरित्र।

समस्या कभी कभी इस तरह के निर्माणों को संकलित नहीं होंगे साथ कोड है - कुछ उम्मीद और अवैध कोड संकलक करने के लिए उपस्थित रहेंगे रूप में विस्तार नहीं होगा। डेवलपर को प्रीप्रोसेसिंग परिणाम दिखाने के लिए आमतौर पर "प्रीप्रोसेस्ड फाइल जेनरेट" विकल्प होता है। लेकिन प्रीप्रोसेस्ड फाइल में मैक्रो को एक पंक्ति में विस्तारित किया जाता है और नतीजा मुश्किल से पठनीय होता है।

यह लाइनब्रेक मैक्रो परिभाषा में मौजूद रखने के लिए पूर्वप्रक्रमक बनाने के लिए संभव है?

+1

आपको उन मामलों में से एक मिला है जहां मैक्रोज़ का कभी भी उपयोग नहीं किया जाना चाहिए। Obfuscated नियंत्रण प्रवाह विशेष रूप से यहाँ बुरा है। –

+2

@nobugz हां, लेकिन वर्तमान में हमारे पास 16 सौ कॉम-एक्सपोज़ड विधि है और हमें उनमें से प्रत्येक में ट्रेसिंग और पैरामीटर का पता लगाने की आवश्यकता है और उन घंटियों और सीटी को बनाए रखने योग्य होना चाहिए। सी ++ मैक्रोज़ का उपयोग करके उस उत्कृष्टता को करने का कोई और तरीका नहीं प्रदान करता है। – sharptooth

उत्तर

6

आप इसे नहीं कर सकते हैं। प्रतिस्थापन टेक्स्ट उस रेखा के अंत तक है जहां यह #define डी है, इसलिए इसमें इसमें नई लाइनें नहीं होंगी। यदि संकलन के साथ आपकी समस्याएं कम होती हैं, तो आप indent के माध्यम से प्रीप्रोसेस्ड फ़ाइल चला सकते हैं या जब आप अधिक पठनीय कोड प्राप्त करने में मदद के लिए ऐसा होता है तो संकलन से पहले ऐसा कुछ भी हो सकता है।

4

यह संभव नहीं है क्योंकि \ अक्षरों को चरण 2, में हटा दिया गया है प्रीप्रोसेसर शामिल है। अनुवाद के चरणों की सूची के लिए प्रश्न Poster with the 8 phases of translation in the C language देखें।

+0

कला का महान टुकड़ा, धन्यवाद। – sharptooth

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