2009-11-27 21 views
6

मैक्रो विस्तार & कोड जनरेशन में & विपक्ष है। आपका पसंदीदा दृष्टिकोण क्या है और क्यों? हमें दूसरे पर कब चुनना चाहिए? कृपया सलाह दें। धन्यवाद!सी/सी ++ मैक्रो विस्तार बनाम कोड जनरेशन

मैक्रो विस्तार बहुत आसान & सहायक हो सकता है: http://dtemplatelib.sourceforge.net/table.htm

बनाम

जबकि कोड पीढ़ी आप अच्छा कोड के बहुत सारे देता है: http://code.google.com/p/protobuf/ http://incubator.apache.org/thrift/

उत्तर

2

जाँच यह एक दुविधा यह है प्रकार की तरह अतिरिक्त लाभ के साथ, C++ 0x Variadic Templates के साथ कवर किया जा सकता है। मुझे एक उदाहरण देने दें। मैं 1 9 85 के आसपास differential execution की तकनीक पर ठोकर खाई, और मुझे लगता है कि यह प्रोग्रामिंग उपयोगकर्ता इंटरफेस के लिए वास्तव में एक अच्छा टूल है।

void Foo(..args..){ 
    x = y; 
    if (..some test..){ 
    Bar(arg1, ...) 
    } 
    while(..another test..){ 
    ... 
    } 
    ... 
} 

और mucks इस तरह नियंत्रण संरचना के साथ:

void deFoo(..args..){ 
    if (mode & 1){x = y;} 
    {int svmode = mode; if (deIf(..some test..)){ 
    deBar(((mode & 1) arg1 : 0), ...) 
    } mode = svmode;} 
    {int svmode = mode; while(deIf(..another test..)){ 
    ... 
    } mode = svmode;} 
    ... 
} 

, एक बहुत अच्छी तरह से अब जब कि ऐसा करने के लिए हो गया होता के लिए एक पार्सर लिखने के लिए मूल रूप से, यह इस तरह से सरल संरचित कार्यक्रमों लेता है सी या जो भी मूल भाषा है, और फिर पार्स पेड़ पर चलें, जो कोड मैं चाहता हूं उसे उत्पन्न करता हूं। (जब मैंने इसे लिस्प में किया था, तो वह हिस्सा आसान था।)

लेकिन कौन सी, सी ++, या जो कुछ भी पार्सर लिखना चाहता है?

तो, बजाय, मैं सिर्फ मैक्रो ताकि मैं इस तरह कोड लिख सकते हैं लिखें:

void deFoo(..args..){ 
    PROTECT(x = y); 
    IF(..some test..) 
    deBar(PROTECT(arg1), ...) 
    END 
    WHILE(..another test..) 
    ... 
    END 
    ... 
} 

हालांकि, जब मैं सी # में ऐसा करते हैं, उनके ज्ञान में किसी निर्णय लिया मैक्रो बुरा थे, और मैं डॉन एक सी # पार्सर लिखना नहीं चाहता, इसलिए मुझे हाथ से कोड पीढ़ी करना होगा। यह शाही दर्द है, लेकिन इन चीजों को कोड करने के सामान्य तरीके की तुलना में यह अभी भी इसके लायक है।

+0

+1 धन्यवाद माइक। यह सबसे अच्छा जवाब है :) – Viet

5

सी या सी ++ में, मैक्रो विस्तार है डीबग करने के लिए कुख्यात मुश्किल है। दूसरी ओर, कोड जेनरेटर लिखना डीबग करना आसान है क्योंकि यह स्वयं में एक अलग प्रोग्राम है।

हालांकि, आपको अवगत होना चाहिए कि यह केवल सी प्रीप्रोसेसर की सीमा है। उदाहरण के लिए, भाषाओं के लिस्प परिवार में, मैक्रो विस्तार कोड जनरेशन है, वे बिल्कुल वही हैं। एक मैक्रो लिखने के लिए, आप एस-अभिव्यक्ति इनपुट को किसी अन्य एस-अभिव्यक्ति में बदलने के लिए एक प्रोग्राम (लिस्प में) लिखते हैं, जिसे तब संकलक को पास किया जाता है।

+0

आपके उत्तर के लिए धन्यवाद, ग्रेग। एक सभ्य कोड जेनरेटर लिखने में अधिक समय लगता है और मैक्रोज़ चीजों को पूरा करने के लिए एक त्वरित हैक की तरह दिखता है। – Viet

+0

++ मेरी भावनाएं बिल्कुल। प्रीप्रोकैसिंग के माध्यम से कदम उठाने का कोई तरीका था तो यह अच्छा होगा। फिर भी, यदि मैक कोड पर्याप्त सरल है तो मैक्रोज़ पसंद करता हूं। –

9

सी ++ के लिए मैं मैक्रोज़ पर टेम्पलेट मेटाप्रोग्रामिंग या कोड जनरेशन पसंद करता हूं, लेकिन मैक्रोज़ का अभी भी उनका उपयोग होता है।

उदाहरण आप dbtemplatelib साथ दे दिया है आदि

+0

आपके सुझाव के लिए धन्यवाद। टेम्पलेट्स में उनके गुण भी हैं। वैराडिक मैक्रोज़ वहां हैं लेकिन विविधता वाले टेम्पलेट अभी तक लोकप्रिय नहीं हैं क्योंकि सी ++ 0x अभी भी नया है। – Viet

+0

ठीक है, सटीक होने के लिए, यह अभी तक बाहर नहीं है, और यह एक "सी ++ 1x" होगा। लेकिन कुछ कंपाइलरों में विविध टेम्पलेट्स लागू किए जाते हैं, उदाहरण के लिए, उन्हें जीसीसी के साथ उपयोग करने के लिए, आपको एक कंपाइलर स्विच के रूप में "-std = C++ 0x" जोड़ना होगा। – hirschhornsalz

3

दोनों की समस्याएं हैं। मैक्रोज़ के विपरीत, कोड जनरेशन पठनीय और डिबगबल (क्या यह भी एक शब्द है?) कोड उत्पन्न कर सकता है, लेकिन यह कम लचीला और बदलने के लिए कठिन है।

+0

+1। जवाब के लिए धन्यवाद। – Viet

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