2016-05-08 6 views
5

निम्नलिखित मैक्रो पर विचार करें:क्यों है अविवेक की जरूरत

#define CAT(X, Y) X ## Y 
#define CMB(A, B) CAT(A, B) 
#define SLB_LOGGING_ALGORITHM CMB(Logging, SLB_ALGORITHM) 

जहां SLB_ALGORITHM एक परिभाषित पूर्व प्रोसेसर प्रतीक है।

यदि मैं का उपयोग सीधे CMB, SLB_ALGORITHM के बजाय सीधे नहीं किया जाता है। यह मामला क्यों है और संकेत कैसे वास्तव में मदद करता है?

उत्तर

2

this answer के शब्दों में:

आप किसी मैक्रो प्रतिस्थापन है, पूर्वप्रक्रमक केवल मैक्रो का विस्तार होगा रिकर्सिवली अगर न stringizing ऑपरेटर # और न ही टोकन-पेस्ट ऑपरेटर ## इसे करने के लिए लागू होते हैं।

तो प्रीप्रोसेसर ## पर लागू होने पर दिए गए मैक्रो का विस्तार नहीं करता है। यही कारण है कि यह CMB(A, B) स्तर में exapnded है, लेकिन सीधे CAT(X, Y) का उपयोग करते समय नहीं।

+0

मुझे अभी भी यह नहीं पता कि यह वास्तव में कैसे काम करता है। जब 'सीएटी' का सीधे उपयोग किया जाता है, तो पहले प्रतिस्थापन को 'सीएटी (लॉगिंग, एसएलबी_एएलजीओआरआईटीएमएम)' का उत्पादन करना चाहिए, जिसमें '##' नहीं है ... – AlwaysLearning

+0

जब 'सीएटी (लॉगिंग, एसएलबी_एएलजीओआरआईटीएमएम)' सीधे इस्तेमाल किया जाता है 'SLB_ALGORITHM' केवल एक बार मैक्रो में पारित किया जाता है, इसलिए यह 'लॉगिंग ## SLB_ALGORITHM' में अनुवाद करता है जिसमें '##' होता है। – Tomer

5

## एक स्ट्रिंग concatenator है, इसलिए यदि आप SLB_LOGGING_ALGORITHM मैक्रो से CAT(Logging, SLB_ALGORITHM) कहते हैं, इस स्ट्रिंग SLB_ALGORITHM के साथ स्ट्रिंग Logging के संयोजन का परिणाम देगा, वह है: LoggingSLB_ALGORITHM जो संभावना है कि तुम क्या नहीं करना चाहता।

जब बुला CMB(Logging, SLB_ALGORITHM)SLB_LOGGING_ALGORITHM से मैक्रो, बजाय, पूर्वप्रक्रमक पहले फैलता Logging और SLB_ALGORITHM (CMB() को कहते हैं) तो विस्तार तार जोड़ (CAT() को कहते हैं)।

+0

'सीएमबी' के कॉल में वास्तव में विस्तार करने के लिए 'SLB_ALGORITHM' का क्या कारण बनता है? ('सीएटी'' के कॉल में से अधिक) – AlwaysLearning

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