2009-10-04 14 views
13

मेरा प्रोग्राम एक लॉग और stdout लिखता है। प्रत्येक संदेश, हालांकि, एक निश्चित प्राथमिकता है और उपयोगकर्ता प्राथमिकताओं में निर्दिष्ट करता है जो प्राथमिकताएं स्ट्रीम (लॉग या stdout) पर जाती हैं।रैपर printf फ़ंक्शन जो उपयोगकर्ता वरीयताओं के अनुसार फ़िल्टर करता है

unsigned short PRIO_HIGH = 0x0001; 
unsigned short PRIO_NORMAL = 0x0002; 
unsigned short PRIO_LOW = 0x0003; 

वरीयताओं कुछ झंडे द्वारा नियंत्रित किया जाता है:

unsigned short PRIO_LOG = (PRIO_HIGH | PRIO_NORMAL); 
unsigned short PRIO_STD = (PRIO_HIGH); 

write_log समारोह unsigned short priority का जोड़ा पैरामीटर के साथ, printf समारोह के रूप में ही मानकों के साथ काम करना चाहिए।

write_log((PRIO_NORMAL|PRIO_LOW), "HELLO %s, take %d", "World", 1); 

(यहां तक ​​कि अगर PRIO_NORMAL|PRIO_LOW थोड़ा समझ में आता है ...)

झंडे जाँच हो रही है आसान है: if(priority & PRIO_LOG) (रिटर्न> 1 यदि कोई झंडा दोनों बहस में सेट किया गया है)

मैं हालांकि नहीं मिल सकता है मैं स्ट्रिंग शाब्दिक और प्रिंटफ फ़ंक्शन के प्रारूप तर्कों को पार करने के बारे में कैसे जाउंगा। क्या कोई मुझे पॉइंटर की मदद या दे सकता है (एक वैकल्पिक विधि के लिए संभव है जो एक ही प्रभाव प्राप्त करता है)? यह बहुत सराहनीय होगा।

उत्तर

33

आप printf के बजाय) vprintf (फोन() चर तर्क "varargs" सी

int write_log(int priority, const char *format, ...) 
{ 
    va_list args; 
    va_start(args, format); 

    if(priority & PRIO_LOG) 
      vprintf(format, args); 

    va_end(args); 
} 

की क्षमताओं अधिक जानकारी के लिए उपयोग करते हुए, this की तर्ज पर कुछ देखना चाहते हैं।

+0

दृश्य सी ++ में आप इसके बजाय _____VA_ARGS_____ का उपयोग कर सकते हैं। संदर्भ: http://msdn.microsoft.com/en-us/library/ms177415(v=vs.110).aspx –

+1

कृपया आवश्यक दिखाने के लिए संपादित करें '# शामिल करें ' – robisrob

5

मुझे लगता है कि जेफ का विचार जाने का तरीका है, लेकिन आप इसे vprintf का उपयोग किये बिना मैक्रो के साथ भी पूरा कर सकते हैं। इसके लिए जीसीसी की आवश्यकता हो सकती है:

#define write_log(priority,format,args...)  \ 
        if (priority & PRIO_LOG) {  \ 
         printf(format, ## args); \ 
        } 

यह कैसे काम करता है इस बारे में जानकारी के लिए here देखें। |

4

आप चाहते हैं PRIO_ * परिभाषाओं बिट के रूप में प्रयोग की जाने वाली है (का उपयोग करते हुए और &), तो आप उनमें से हर एक का अपना सा देना चाहिए:

unsigned short PRIO_HIGH = 0x0001; 
unsigned short PRIO_NORMAL = 0x0002; 
unsigned short PRIO_LOW = 0x0004; 

मैक्रो करते उपयोग करके सुधार किया जा सकता {} जबकि (0) नोटेशन। यह एक कथन की तरह write_log अधिनियम को कॉल करने के लिए कॉल करता है।

#define write_log(priority,format,args...) do { \ 
    if (priority & PRIO_LOG) { \ 
     printf(format, ## args); \ 
    } while(0) 
+0

क्षमा करें, टाइप करें। मैंने इसे अपने स्रोत में ऐसा किया था। संकेत देने के लिए धन्यवाद! एक उत्सुक आंख के लिए +1। – wsd