मैंने एक मैक्रो MYMACRO परिभाषित किया। नोट: मान मान्य एनएसएसटींग नहीं है।रनटाइम पर किसी भी स्ट्रिंग कॉन्सटेनेशन का उपयोग किये बिना मैक्रो को एनएसएसटींग में कैसे विस्तारित किया जाए?
#define MYMACRO is
मैक्रो अंदर प्रयोग किया जाता है एक NSString
@"This MYMACRO fun"
की घोषणा हालांकि, पूर्वप्रक्रमक मैक्रो विस्तार नहीं करता है।
#define MYMACRO @"is"
@"This "[email protected]" fun"
मैक्रो फैलता है जो नीचे के रूप में एक वैध ऑब्जेक्टिव-सी वाक्य रचना है:
preprocessed परिणाम@"This MYMACRO fun"
सबसे अच्छा समाधान मैं अब तक पाया मैक्रो विस्तार करने के लिए प्राप्त करने के लिए है
@"This "@"is"@" fun"
हालांकि, इसे रनटाइम पर 2 concatenation की आवश्यकता है।
तो मेरा प्रश्न रनटाइम पर किसी भी स्ट्रिंग कॉन्सटेनेशन के बिना मैक्रो इंस्टो एन एनएसएसटींग को कैसे सम्मिलित करना है?
आदर्श रूप में, मैं क्रम पर अमल @"This is fun"
बल्कि @"This "@"is"@" fun"
से
आप सही हैं। यदि आप कोड के लिए असेंबली उत्पन्न करते हैं जो इस तरह के संयोजन को करता है, तो आप देख सकते हैं कि यह एक .asciiz स्ट्रिंग के रूप में समाप्त होता है। – UIAdam
मुझे लगता है कि यह भी जोड़ना उचित है कि भले ही रनटाइम पर कॉन्सटेनेशन हुआ हो, फिर भी कुछ स्ट्रिंग ऑपरेशंस को बचाने के लिए कुछ बदसूरत मैक्रो लिखने के लिए पीछे की तरफ झुकना उचित नहीं है। पहले स्पष्ट कोड लिखें और फिर प्रदर्शन के बारे में चिंता करें। व्यक्तिगत रूप से मैं दूसरे के अंदर एक एनएसएसटींग डालने के लिए stringWithFormat का उपयोग कर देख रहा हूं। – UIAdam
@AdamW: क्या आपका मतलब है कि कंपाइलर अनुकूलित करता है @ "यह" @ "" @ "मजेदार" @ "यह मजेदार है" संकलन समय पर? मैं आपसे सहमत हूं, मैं कुछ स्ट्रिंग ऑपरेशंस को सहेजने के बजाय सरल स्रोत कोड रखना पसंद करता हूं। मैं समयपूर्व अनुकूलन में पड़ रहा हूं और हम सभी जानते हैं कि इसका क्या अर्थ है: "समयपूर्व अनुकूलन सभी बुराइयों की जड़ है - डी। Knuth" –