मैं लगभग इस कोड के साथ एक साफ 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
अब, कोई और गन्दा लॉग नहीं !!!
काम ठीक। मैंने सोचा कि '#VA_ARGS__' के साथ कोई अर्थ नहीं है, लेकिन काम करें। – Rodrigo
आपको printf ("% s \ n" को fprintf (stderr, "% s \ n" में बदलना चाहिए। कई कारणों से, सबसे महत्वपूर्ण बात यह है कि printf को कैश किया जाता है, जिसे cached किया जाता है, stderr बाहर कैश नहीं किया जाता है –
हम .. @ नाथन डे। मैंने इस तरह की चीजें देखी और समझ में नहीं आया। लेकिन अगर यह चीजों को बेहतर बनाता है, तो मैं इसका उपयोग करूंगा :) – Rodrigo