2011-03-16 14 views
8
#define max(a,b) \ 
    ({ typeof (a) _a = (a); \ 
     typeof (b) _b = (b); \ 
    _a > _b ? _a : _b; }) 

क्यों नहीं (a>b ? a : b)?सी में इस तरह से 'अधिकतम' मैक्रो परिभाषित क्यों किया गया है?

+3

कृपया ध्यान दें कि टाइप गैर-मानक कीवर्ड है जिसे आप जीसीसी एक्सटेंशन और इसी तरह से सामना कर सकते हैं। एक सख्त सी/सी ++ कंपाइलर पर, टाइपऑफ() संकलित नहीं होगा। – Lundin

+2

क्योंकि जीएनयू लोगों के बदले में बदनाम, अपरिवर्तनीय कोड जीएनयू-विशिष्ट हैक्स से भरा होगा, बस दस्तावेज़ के मुकाबले आप एक मैक्रो के साइड इफेक्ट्स के साथ अभिव्यक्ति नहीं पारित कर सकते हैं ... –

उत्तर

19

क्योंकि otherwhise max(f(1), f(2)) दो कार्यों में से एक दो बार कहेंगे:

f(1) > f(2) ? f(1) : f(2) 
बजाय "कैशिंग" _a में दो मूल्यों और _b आप

({ 
    sometype _a = (a); 
    sometype _b = (b); 

    _a > _b ? _a : _b; 
}) 

(और स्पष्ट रूप से अन्य के रूप में है द्वारा

ध्यान दिया, autoincrement/autodecrement के साथ एक ही समस्या है)

मुझे नहीं लगता कि यह विजुअल एस द्वारा समर्थित है इस तरह से tudio। यह एक यौगिक बयान है। यहां पढ़ें does msvc have analog of gcc's ({ })

मैं जोड़ देंगे कि जीसीसी यहाँ http://gcc.gnu.org/onlinedocs/gcc-2.95.3/gcc_4.html#SEC62 दिया मैनुअल में यौगिक बयान की परिभाषा बहुत :-)

8

यह प्रमुख समस्या को हल हो रही है अधिकतम के लिए प्रश्न में से एक के लिए इसी तरह एक कोड से पता चलता

#define max(a,b) ((a) > (b) ? a : b) 

जैसी चीजों की है जब आप से कॉल करने की:

int x = max (a++, b--); 

चूंकि यह साधारण पाठ प्रतिस्थापन है,

int x = ((a++) > (b--) ? a++ : b--); 

जो नहीं है आप क्या चाहते हैं: कि का परिणाम है।

का उपयोग करके:

int x = ({ int _a = a++; int _b = b--; _a > _b ? _a : _b; }) 

जो दुष्प्रभाव केवल एक बार चलाता है:

#define max(a,b) ({ 
    typeof (a) _a = (a);\ 
    typeof (b) _b = (b); \ 
    _a > _b ? _a : _b; }) 

यह अस्थायी चर कि प्रभावी रूप से आप दे उपयोग करता है।

लेकिन, ईमानदारी से, आप खाई चाहिए कि पूरी तरह स्थूल और एक inline समारोह, या यहाँ तक कि एक गैर इनलाइन फ़ंक्शन का उपयोग करें, क्योंकि ज्यादातर समय, संकलक भी बिना अनुकूलन के एक सभ्य काम कर सकते हैं वह सुझाव

1

यदि मैक्रो को अभिव्यक्ति के साथ बुलाया जाता है, तो इससे अप्रत्याशित व्यवहार हो सकता है। इस मान लें:

int c = max(i++, j++);

इस मामले में, अधिकतम सरल संस्करण के साथ वृद्धि दो बार है।

+0

एक अधिक संभावित आमंत्रण 'अधिकतम (* पी ++, * q ++) '। –

3

एक और तरीका है अधिकतम निर्धारित करने के लिए (कम से कम सकारात्मक संख्या के लिए)

#define MAX(a,b) sizeof(union x { char ca[a]; char cb[b];}) 

ए और बी के रूप में केवल एक बार एक्सेस किया जाता है, मैक्स (एक ++, ख ++) सही परिणाम देता है।

+0

क्या मुझे यकीन है कि संकलक वास्तव में संघ को तुरंत चालू नहीं करता है? – pezcode

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