2011-01-27 24 views
12

मुझे लगता है कि आप में से अधिकांश ने सी/सी ++ के साथ काम किया है, इस बारे में अंतर्ज्ञान है कि प्रीप्रोसेसर कैसे काम करता है (अधिक या कम)। मैंने आज तक ऐसा सोचा, लेकिन मेरा अंतर्ज्ञान गलत साबित हुआ। यहां कहानी है:(अजीब?) जीसीसी प्रीप्रोसेसर व्यवहार

आज मैंने कुछ करने की कोशिश की, लेकिन मैं परिणाम की व्याख्या नहीं कर सकता।

#define A B 
#define B A 

A 
B 

क्या होता है: पहले निम्नलिखित कोड पर विचार? खैर, ई फ़्लैग से संकलन के बाद परिणाम यह है:

A 
B 

ठीक है, ठीक है, शायद नहीं क्या किसी को भी उम्मीद होती है, लेकिन यह समझाने के योग्य है। मुझे लगता है कि प्रीप्रोसेसर किसी भी तरह से पता चला कि कुछ समस्या है, और नहीं किया। , Unexplainable परिणाम मेरे लिए

#define A B 
#define B A C 
#define C x 

A 
B 

अब करने के लिए,:

A x 
B x 

यह कैसे हुआ

अगली बात मैंने कोशिश की यह था? मैं यह कैसे हुआ यह किसी भी उचित तरीके से पता नहीं लगा सकता। पहला आदेश (#define ए बी) निष्पादित नहीं किया जा सकता है, क्योंकि तब ए को बी द्वारा प्रतिस्थापित किया जाएगा, और अंतिम परिणाम दोनों के लिए समान होना चाहिए। लेकिन अगर ऐसा नहीं है, तो कोई रास्ता नहीं है कि "ए एक्स" हो सकता है!

मेरा प्रश्न: मुझे क्या याद आ रही है? जाहिर है, मैं प्रीप्रोसेसर कैसे काम करता है इसका सही तरीका नहीं जानता। क्या आप इसके बारे में कोई स्रोत जानते हैं?

+0

और यही कारण है कि # डिफाइन से बचने की आवश्यकता है ... – Goz

+0

हाँ, यह एक और कारण है .. ऐसा नहीं है कि मेरा मतलब है कि उनका उपयोग न करें। कुछ कार्यों के लिए वे बहुत उपयोगी हैं (और i.m.o. जाने का तरीका)। – George

उत्तर

13

Self-Referential Macros बताते हैं। विस्तार गहराई से लागू होता है लेकिन एक बार मैक्रो संदर्भ स्वयं बंद हो जाता है।

+0

अच्छा और सहायक लिंक, धन्यवाद! – George

5
#define A B 
#define B A C 
#define C x 

A -> B -> A C -> A x 
B -> A C -> B x 

विस्तार टोकन द्वारा टोकन "lazily"

3

ठीक है, ठीक है, हो सकता है क्या किसी को भी उम्मीद होती है नहीं है, लेकिन यह समझाने के योग्य है। मुझे लगता है कि कि प्रीप्रोसेसर ने किसी भी तरह को बताया कि कुछ समस्या है, और ने नहीं किया था।

नहीं। यदि प्रीप्रोसेसर एक विस्तार करता है, तो यह केवल एक बार एक प्रतीक फैलता है। तो ए के लिए आपके पहले उदाहरण में: ए को बी में विस्तारित किया गया है, बी ए तक फैलता है और यहां विस्तार बंद हो जाता है। दूसरी पंक्ति में बी को ए में विस्तारित किया जाता है जो बी को फैलाता है, जहां विस्तार बंद हो जाता है, क्योंकि हमने पहले ही बी का विस्तार किया है।

यदि आप अपने दूसरे उदाहरण में तर्क लागू करते हैं, तो परिणाम तुरंत स्पष्ट हो जाता है।

5

प्रतिस्थापन की प्रत्येक श्रृंखला सबसे अधिक बार किसी भी मैक्रो परिभाषा पर जा सकती है। अन्य चीजों के अलावा, इसका मतलब है कि आपके पास रिकर्सिव मैक्रोज़ नहीं हो सकते हैं।

अपने दूसरे उदाहरण के लिए प्रतिस्थापन इस तरह दिखेगा: पहली पंक्ति के अंतिम चरण के दौरान

A --[evaluate A]--> B --[evaluate B]--> A C --[evaluate C]--> A x 
B --[evaluate B]--> A C --[evaluate A,C]--> B x 

, A मूल्यांकन नहीं है, क्योंकि यह पहले से ही पहले से लागू किया गया था। इसी तरह, दूसरी पंक्ति में, मूल्यांकन B पर बंद हो जाता है क्योंकि यह पहले चरण के दौरान पहले ही देखा जा चुका है।

सी 99 मानक का प्रासंगिक खंड 6.10.3.4 Rescanning और आगे प्रतिस्थापन होगा।

+0

स्पष्टीकरण के लिए धन्यवाद! मैं ग्रामर और भाषाओं के संदर्भ में सोच रहा था और मैंने पूरी तरह स्पष्ट स्पष्टीकरण को याद किया। – George

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