2014-04-23 14 views
7

मैं कुछ स्रोत कोड पढ़ रहा हूं। एक लंबे समय से लंबी स्ट्रिंग है कि एक समारोह के रूप में कार्य करता है परिभाषित करने के लिएफ़ंक्शन को परिभाषित करने के लिए कीवर्ड को परिभाषित करने का उपयोग क्यों करें

#define DO_BINOP(FN_NAME,TFLAG,OPER) \ 
    void FN_NAME (bigint_stack &stack) { \ 
     bigint right = stack.front(); \ 
     stack.pop_front(); \ 
     TRACE (TFLAG, "right = " << right); \ 
     bigint left = stack.front(); \ 
     stack.pop_front(); \ 
     TRACE (TFLAG, "left = " << left); \ 
     bigint result = left OPER (right); \ 
     TRACE (TFLAG, "result = " << result); \ 
     stack.push_front (result); \ 
    } 

DO_BINOP(do_add, '+', + ) 

वे define का उपयोग करें: और न केवल इस स्रोत कोड, लेकिन यह भी कई अन्य लोगों, प्रोग्रामिंग इस तरह का उपयोग करें। मुझे नहीं पता कि ऐसा करने का क्या फायदा है, क्योंकि इस तरह से कार्यक्रम को पढ़ने में कठिनाई होती है, और डीबग करना कठिन होता है। मैं सी के लिए नया हूँ, इसलिए मुझे लगता है कि इस तरह से कुछ लाभ होना चाहिए, है ना?

धन्यवाद।

+5

इस तरह वे कई कार्यों को परिभाषित कर सकते हैं जो प्रत्येक उदाहरण के लिए केवल एक मैक्रो आमंत्रण का उपयोग करके नाम और ऑपरेशन से भिन्न होते हैं। –

+0

Cuz व्यक्ति दुखद है। गंभीरता से हालांकि, यह अस्तर में मजबूर करने का एक तरीका है। यह थोड़ा और अधिक मानक तोड़ सकता है। इस मामले में, ऐसा इसलिए है क्योंकि वह व्यक्ति जो ऑपरेटर को तर्क के रूप में पास करता है। – IdeaHat

+4

@MadScienceDreams मैक्रो * परिभाषित करता है * एक फ़ंक्शन परिभाषित करता है (अभिव्यक्ति में विस्तार करने के बजाय, एक गरीब व्यक्ति के कार्य के रूप में) ताकि इस मामले में कोई इनलाइनिंग-संबंधित कारण न हो। – delnan

उत्तर

11

क्योंकि अन्यथा आप एक स्रोत कोड है कि इस तरह दिखता है होगा:

void do_add (bigint_stack &stack) { 
    bigint right = stack.front(); 
    stack.pop_front(); 
    TRACE ('+', "right = " << right); 
    bigint left = stack.front(); 
    stack.pop_front(); 
    TRACE ('+', "left = " << left); 
    bigint result = left + (right); 
    TRACE ('+', "result = " << result); 
    stack.push_front (result); 
} 

void do_subtract (bigint_stack &stack) { 
    bigint right = stack.front(); 
    stack.pop_front(); 
    TRACE ('-', "right = " << right); 
    bigint left = stack.front(); 
    stack.pop_front(); 
    TRACE ('-', "left = " << left); 
    bigint result = left - (right); 
    TRACE ('-', "result = " << result); 
    stack.push_front (result); 
} 

वगैरह ...

अब

, तो आप एक ट्रेस जोड़ना चाहते हैं, उदाहरण के लिए, आप होगा फिर से उन सभी को कॉपी-पेस्ट करें।

लेखक क्या चाहता था, वास्तव में, पैरामीटरयुक्त इनपुट के एक सेट से कार्यों को उत्पन्न करने के लिए एक तरीका परिभाषित करना है, जिसके परिणामस्वरूप कार्य सभी समान हैं लेकिन वे इनपुट के आधार पर थोड़ा अलग तरीके से व्यवहार करते हैं उन्हें उत्पन्न करें। इसे मेटा प्रोग्रामिंग कहा जाता है। कोडिंग पार्सर्स में बहुत आम है, जो मुझे संदेह है कि यह स्निपेट कहाँ से आया था।

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

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

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