2012-01-16 15 views
11

क्या इस तरह के मैक्रो को "ओवरलोड" करने का कोई बेहतर तरीका है? मुझे एक मैक्रो की आवश्यकता है जो विभिन्न मानकों को स्वीकार करता है।ओवरलोड सी मैक्रोज़

#define DEBUG_TRACE_1(p1) std::string p[] = {p1}; log _log(__FUNCTION__, p, 1) 
#define DEBUG_TRACE_2(p1, p2) std::string p[] = {p1, p2}; log _log(__FUNCTION__, p, 2) 
#define DEBUG_TRACE_3(p1, p2, p3) std::string p[] = {p1, p2, p3}; log _log(__FUNCTION__, p, 3) 
#define DEBUG_TRACE_4(p1, p2, p3, p4) std::string p[] = {p1, p2, p3, p4}; log _log(__FUNCTION__, p, 4) 
#define DEBUG_TRACE_5(p1, p2, p3, p4, p5) std::string p[] = {p1, p2, p3, p4, p5}; log _log(__FUNCTION__, p, 5) 

इस

DEBUG_TRACE_2("more", "params"); 
+1

सी ++ मैक्रो प्रोसेसर (एएनएसआई सी के बारे में पता नहीं है) में कुछ varargs समर्थन नहीं है, लेकिन हर बार: यह variadic तर्क की तरह लगता है आपके उपयोग के मामले के लिए ठीक हो जाएगा के बाद से, मैं सिर्फ एक लिंक प्रदान करेंगे मैं इसका उपयोग करने की कोशिश करता हूं मुझे लगता है कि ज्ञात ब्रह्मांड का एक प्रत्यारोपण होता है। –

+1

यहां थोड़ा सा: http: //stackoverflow.com/questions/679979/how-to-make-a-variadic-macro-variable-number-of-arguments –

+1

'# परिभाषित DEBUG_TRACE (ar, n) std :: स्ट्रिंग पी [] = आरआर; लॉग _log (__ फ़ंक्शन __, पी, एन) ', 'DEBUG_TRACE ({" अधिक "," पैरा "}, 2 के साथ कॉल करें;' बहुत आसान था? –

उत्तर

19

अपने विशिष्ट उदाहरण करने के लिए एक variadic मैक्रो के साथ होगा सबसे आसान तरीका:

#define DEBUG_TRACE(...)          \ 
    do {              \ 
     std::string p[] = { __VA_ARGS__ };      \ 
     log _log(__FUNCTION__, p, (sizeof p)/(sizeof p[0])); \ 
    } while (0) 

एक जोड़े नोट:

  1. __VA_ARGS__ अल्पविराम से अलग तर्क को आपूर्ति की सूची के लिए नाम है मैक्रो
  2. आप यह पता लगा सकते हैं कि sizeof का उपयोग करके आपके मामले में कितने हैं, क्योंकि पी एक स्थैतिक सरणी है
  3. सुर अपने मैक्रो कोड को गोल करने के दौरान ... अक्सर इसे अच्छा अभ्यास माना जाता है क्योंकि यह चर (पी) को एक ब्लॉक स्कोप देता है ताकि उपयोगकर्ता अभी भी मैक्रो के बाहर एक ही नाम के साथ एक चर हो सकें, और जबकि (0) भाग अच्छी तरह से अर्धविराम स्वीकार करता है बाद में एक पंक्ति को तोड़ने के बयान

आप इस तुलना में अधिक लचीलापन की जरूरत है, तो बिना, आप आप स्पष्ट रूप से "अधिभार" मैक्रो को मानकों की एक अलग संख्या के साथ पूरी तरह से अलग तरीके से व्यवहार करने के लिए अनुमति देने के लिए एक बहुत ही साफ चाल का उपयोग कर सकते हैं। हालांकि, यह कोड को और अधिक मजबूत बनाता है और केवल तभी उपयोग किया जाना चाहिए जब यह बिल्कुल जरूरी हो। http://cplusplus.co.il/2010/07/17/variadic-macro-to-count-number-of-arguments/

+0

+1 करें 'नोट करते समय' नोट – tangrs

+1

स्पष्ट रूप से केवल एक टाइपो लेकिन मैक्रो केवल '{{' 'तक फैलता है। पिछली जरूरत को छोड़कर बाकी लाइनों को भी घटाया जाना चाहिए। – ahcox

+0

@ हाकोक्स धन्यवाद, तय! –

14

की तरह कहा जाता है यह उपयोग करना संभव है मानक C/C++ मैक्रो, कम से कम जीसीसी में में variadic आर्ग (संपादित करें: जाहिरा तौर पर वे मानकीकृत कर रहे हैं, और एमएस सी संकलक also has them) ।

यह कैसे काम करता है इस बारे में कुछ जानकारी के लिए this page देखें।

इस साइट पर another question भी है जो आपके लिए उपयोगी हो सकता है।

+5

वैरैडिक मैक्रोज़ को सी 99 और सी ++ 11 में मानकीकृत किया गया था: http://en.wikipedia.org/wiki/Variadic_macro – Thomas

+2

यह सी ++ 11 में भी समर्थित है: "अगर पहचानकर्ता में' 'है ...' मैक्रो परिभाषा में सूची, फिर किसी भी अलग कॉमा प्रीप्रोकैसिंग टोकन समेत पिछला तर्क, एक आइटम बनाने के लिए विलय कर दिया गया है: परिवर्तनीय तर्क। इतने संयुक्त तर्कों की संख्या ऐसी है कि, विलय के बाद, तर्कों की संख्या एक और है मैक्रो परिभाषा में पैरामीटर की संख्या की तुलना में ".." एक पहचानकर्ता '__VA_ARGS__' जो प्रतिस्थापन सूची में होता है, को इस तरह माना जाएगा कि यह पैरामीटर था, और परिवर्तनीय तर्क इसे बदलने के लिए प्रयुक्त प्रीप्रोकैसिंग टोकन बनाते हैं। " –

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