2012-06-11 13 views
7

संभव डुप्लिकेट:
How to make a variadic macro (variable number of arguments)क्या मेरे पास सी मैक्रो हो सकता है जो पैरामीटर की अपरिभाषित संख्या स्वीकार करता है?

मैं जो printf के समान तर्क स्वीकार करता है और उन्हें लॉग बुनियादी सी में एक लॉग मैक्रो करना चाहते हैं। हालांकि, मैं चाहता हूं कि यह कैसे लॉग हो (लॉग स्तर, फ़ाइल बनाम stderr, आदि) संकलन समय पर कुछ सेट होने के लिए, रनटाइम नहीं; यदि विधि कम स्तर के लॉगिंग को अनदेखा करने के लिए पैरामीटर सेट करता है तो विधि कुछ भी नहीं कर रही है और आशा है कि कोड से ऑप्टिमाइज़ किया जा रहा है।

अभी तक मेरे पास एक मैक्रो है जिसे संकलित समय में परिभाषित पैरामीटर के आधार पर परिभाषित किया गया है। यदि पैरामीटर परिभाषित किया गया है लॉगिंग मेरी लॉग विधि (फाइलों पर लॉग इन करने के लिए) पर जाती है अन्यथा यह stderr पर जाती है। हालांकि, मैं केवल इस मैक्रो में एक स्ट्रिंग पास कर सकता हूं। लॉग विधि printf वाक्यविन्यास का उपयोग करके अनिश्चित संख्या में तर्क और कार्य करने में सक्षम है। मैं जानना चाहता हूं कि मेरे मैक्रो को सेट करने का कोई तरीका है या नहीं, तो यह लॉग फ़ाइल में अनिश्चित संख्या में तर्क पारित करेगा?

और चूंकि मुझे संदेह है कि जवाब यह है कि मैं ऐसा नहीं कर सकता हूं, जो मूलभूत सी में मैं चाहता हूं (मैं सी ++ या बूस्ट का उपयोग नहीं कर सकता) प्राप्त करने का एक और तरीका है।

उत्तर

7

सी 99 में मैक्रोज़ हैं जो तर्कों की एक चर संख्या को स्वीकार कर सकते हैं। उन्हें वैरैडिक मैक्रोज़ कहा जाता है।

http://gcc.gnu.org/onlinedocs/cpp/Variadic-Macros.html

उदाहरण:

#define eprintf(...) fprintf (stderr, __VA_ARGS__) 
#define dfprintf(stream, ...) fprintf(stream, "DEBUG: " __VA_ARGS__) 
2

हाँ आप कर सकते हैं। सी 99 इस out of the box का समर्थन करता है।

#define debug(format, ...) fprintf (stderr, format, ## __VA_ARGS__)