2010-11-22 10 views
25

के साथ कोई तर्क के साथ एक पूर्वप्रक्रमक मैक्रो के बीच का अंतर है, और एक क्या है वहाँ पसंद करते हैं करने के लिए किसी भी कारण हैशून्य तर्क

#define MY_MACRO() ..stuff.. 

को

#define MY_MACRO ..stuff.. 

मैक्रो का उपयोग न करें एक मान्य है उत्तर ...

+2

चूंकि आपने सी ++ टैग जोड़ा है मैक्रोज़ का उपयोग न करने का एक वैध उत्तर है। यदि आप प्री-प्रोसेसर के बारे में बात करना चाहते हैं तो इसे प्री-प्रोसेसर के रूप में टैग करें और सी ++ –

+12

@ मार्टिन: प्रीप्रोसेसर एस ++ के रूप में सी ++ का हिस्सा नहीं है; एसटीएल के बारे में प्रश्नों को '[stl] 'टैग किया जाना चाहिए और' [C++]' भी नहीं? यह सच है कि मैक्रोज़ का अधिकांश समय सी ++ में उपयोग नहीं किया जाना चाहिए, लेकिन कभी-कभी वे असाधारण रूप से सहायक हो सकते हैं। –

+4

@ जेम्स मैकनेलिस: वास्तव में, मैक्रोज़ के बिना बूस्ट पुस्तकालयों को लागू करना व्यावहारिक रूप से असंभव होगा! –

उत्तर

16

प्रतिस्थापन केवल फ़ंक्शन-जैसे मैक्रो के लिए होता है यदि मैक्रो नाम बाएं कोष्ठक के बाद होता है।

MY_MACRO() 
MY_MACRO () 
MY_MACRO 
() 

लेकिन यह नहीं होगा:: तो, सभी निम्नलिखित समारोह की तरह मैक्रो MY_MACRO() आह्वान

MY_MACRO SomethingElse 

यह कैसे आप मैक्रो और क्या यह के रूप में है कि क्या करने के लिए प्रयोग किया जाता है का उपयोग कर रहे पर निर्भर करता है या यह महत्वपूर्ण नहीं है। आदर्श रूप में, आपके मैक्रोज़ के सभी अलग-अलग नाम होंगे; यदि आप मैक्रोज़ के लिए सभी अपरकेस पहचानकर्ता आरक्षित करते हैं, तो इससे कोई फ़र्क नहीं पड़ता कि आप ऑब्जेक्ट-जैसे या फ़ंक्शन-जैसी मैक्रो का उपयोग शून्य पैरामीटर के साथ करते हैं या नहीं।

सौंदर्यशास्त्र से, आमतौर पर यह आमतौर पर (लेकिन हमेशा नहीं) क्लीनर नहीं होता है जो कार्यप्रवाहों की तरह नहीं है जो शून्य पैरामीटर लेते हैं।

+0

जैसा कि मैंने नीचे उल्लेख किया है, यदि 'MY_MACRO' कहता है, तो एक ऐसे फ़ंक्शन के लिए भरना जो पर्यावरणीय परिस्थितियों (कहें, ओएस एक्स और विंडोज के लिए अलग-अलग फ़ंक्शंस) पर निर्भर करता है, फिर इसे बिना किसी ब्रांड्स के उपयोग करके फ़ंक्शन पॉइंटर्स के माध्यम से उस फ़ंक्शन को पास करने की अनुमति देता है , जो सहायक हो सकता है। –

+0

तो इससे मैं कह सकता हूं कि नीचे दी गई दो मैक्रो परिभाषाएं कार्यात्मक रूप से # परिभाषित करें MIN0() X

1

मैक्रो (x) आपके पास पास होने के पैरामीटर होने पर प्राथमिक है। आप एक सरल कर रहे हैं "की जगह" तो, IMO, अपने preferrable #define ब्ला उपयोग करने के लिए ...

6

मैं, कोष्ठकों के साथ MY_MACRO(), उपयोग करना पसंद करते हैं क्योंकि यह महसूस करता है और अधिक की तरह मैं एक समारोह फोन कर रहा हूँ। अन्यथा ऐसा लगता है कि मैं एक निरंतर फोन कर रहा हूँ:

MY_MACRO(); 

बनाम

MY_MACRO; 

है कि अगर परिभाषा नहीं बल्कि सिर्फ एक सरल निरंतर मूल्य की तुलना में, कोड कॉल करने के लिए प्रयोग किया जाता है।

+7

यदि 'MY_MACRO' एक फ़ंक्शन के लिए केवल एक रैपर है (जिसे संभवतः कहीं भी छुपाया गया है, या पर्यावरण के आधार पर बदलने की जरूरत है, या कुछ), तो इसे बिना किसी कंस्ट्रैसिस के परिभाषित करने से आप उस कार्य को एक कार्य के रूप में पारित कर सकते हैं अन्य कार्यों के लिए फ़ंक्शन पॉइंटर, जो उपयोगी हो सकता है या नहीं भी हो सकता है। –

+0

@ChrisLutz एक और परिप्रेक्ष्य से, यह चिंता करने के लिए एक और मैक्रो प्रतीक भी जोड़ देगा। 'संरचना राज्य {int errno;/* त्रुटि! * /}; ' – YoYoYonnY

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