2011-09-22 7 views
23

मैं लगभग इस कोड के साथ एक साफ NSLog परिष्करण:स्वच्छ NSLog - कोई टाइमस्टैम्प और कार्यक्रम का नाम

#define NSLog(FORMAT, ...) printf("%s\n", [[NSString stringWithFormat:FORMAT, __VA_ARGS__] UTF8String]); 

यह काम ठीक है, तो मैं क्या यह:

NSLog(@"Show %@ message", @"this"); 

लेकिन, असफल हो जायेगी अगर मैं उपयोगकर्ता यह

NSLog(@"One argument"); 

क्योंकि __VA_ARGS__ कुछ भी नहीं है, इसलिए यह

उत्पादन
printf("%s\n", [[NSString stringWithFormat:@"One argument",] UTF8String]); 

तो, समस्या अल्पविराम है। क्योंकि यह मैक्रो है, __VA_ARGS__ कुछ भी नहीं है। तो मैं __VA_ARGS__==nil जैसी चीजें नहीं कर सकता क्योंकि ==nil का उत्पादन करेगा और असफल हो जाएगा।

प्रश्न सरल है: __VA_ARGS__ पर कुछ भी नहीं है? या अधिक तर्क होने पर केवल अल्पविराम का उपयोग करें।

- संपादित करें -

ज़ुज़े समस्या का समाधान! सर्वोत्तम कोड होने के लिए, इसे इस तरह से उपयोग कर सकते हैं:

#ifdef DEBUG 
#define NSLog(FORMAT, ...) fprintf(stderr,"%s\n", [[NSString stringWithFormat:FORMAT, ##__VA_ARGS__] UTF8String]); 
#else 
#define NSLog(...) 
#endif 

अब, कोई और गन्दा लॉग नहीं !!!

उत्तर

56

उपयोग इस कोड (## हिस्सा नोटिस):

#define NSLog(FORMAT, ...) fprintf(stderr, "%s\n", [[NSString stringWithFormat:FORMAT, ##__VA_ARGS__] UTF8String]); 
+0

काम ठीक। मैंने सोचा कि '#VA_ARGS__' के साथ कोई अर्थ नहीं है, लेकिन काम करें। – Rodrigo

+4

आपको printf ("% s \ n" को fprintf (stderr, "% s \ n" में बदलना चाहिए। कई कारणों से, सबसे महत्वपूर्ण बात यह है कि printf को कैश किया जाता है, जिसे cached किया जाता है, stderr बाहर कैश नहीं किया जाता है –

+0

हम .. @ नाथन डे। मैंने इस तरह की चीजें देखी और समझ में नहीं आया। लेकिन अगर यह चीजों को बेहतर बनाता है, तो मैं इसका उपयोग करूंगा :) – Rodrigo

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