2015-06-24 13 views
8

मुझे प्रीप्रोसेसर के साथ एक छोटी सी समस्या है जो मुझे पहेली करता है और मुझे दस्तावेज़ीकरण/प्रीप्रोसेसर/भाषा स्पेक में कोई स्पष्टीकरण नहीं मिल रहा है। ,सी/सी ++ प्रीप्रोसेसर यहां एक जगह क्यों जोड़ रहा है?

aaa bbb <--- why is space added here 
aaa.bbb 

trigraphs से निपटने के बाद लाइनों और टिप्पणियों को जारी रखा, पूर्वप्रक्रमक पूर्वप्रक्रमक निर्देशों पर काम करता है और पूर्व प्रसंस्करण टोकन और रिक्त स्थान को में इनपुट विभाजित करता है:

#define booboo() aaa 
booboo()bbb 
booboo().bbb 

में preprocessed है। Booboo की प्रतिस्थापन सूची में एक पीपी-टोकन शामिल है जो 'aaa' पहचानकर्ता है। booboo() बीबीबी पीपी-टोकन में बांटा गया है: 'बूबू', '(', ')', 'बीबीबी'। 'बूबू', '(', ')' का अनुक्रम कार्यात्मक मैक्रो आमंत्रण के रूप में पहचाना जाता है और इसे 'aaa' में विस्तारित किया जाना चाहिए और आउटपुट में इमो को 'aaabbb' जैसा दिखना चाहिए। मैंने कहा - मानव की तरह दिखते हैं - यह एक टोकन जैसा दिखता है जबकि कंपाइलर को 2 टोकन 'एएए' और 'बीबीबी' मिलेगा क्योंकि कोई '##' ऑपरेटर इस्तेमाल नहीं किया गया था जो पीपी-टोकन कॉन्सटेनेशन की अनुमति देता है। क्यों/कौन सा नियम सीपीपी (सी प्रीप्रोसेसर) को 'aaa' और 'bbb' के बीच अतिरिक्त स्थान देता है जब 'boaoo()। Bbb' 'aaa.bbb' में बिना अंतरिक्ष के परिणाम?

ऐसा इसलिए है क्योंकि सीपीपी उत्पादन करने की कोशिश करता है (जो ज्यादातर मनुष्यों के लिए है) असंबद्ध? मानव यह बताने में सक्षम नहीं है कि 'aaabbb' 2 टोकन से बना है क्योंकि यह केवल टोकन की वर्तनी को देखता है। क्या मैं सही हू? मैंने सीपीपी के लिए प्रीप्रोसेसर और जीसीसी के दस्तावेज के बारे में सी 99 दस्तावेज पढ़ा है। मुझे इसके बारे में कुछ नहीं दिख रहा है।

#define baba() + 
baba()+ 
baba()- 

परिणामों में:

अगर मैं सही हूँ हम यहाँ ऐसी ही स्थिति है

+ + 
+- 

अन्यथा (यदि '++' उत्पादन होता है) यह कैसा 'एक मानव देने का प्रयास करेगा ++ 'टोकन लेकिन 2 टोकन' + 'और' + 'होगा। क्या यह '##' ऑपरेटर के साथ है कि सीपीपी जांच करता है कि क्या संगतता वैध टोकन उत्पन्न करती है लेकिन दिखाए गए मामलों में मानव को रोकना है कि कंसटेनेशन किया गया था? '+ -' संदिग्ध नहीं है इसलिए

+1

यह ध्यान देने योग्य है: सी मानक उपकरण के बारे में कुछ नहीं कहता है जो संकलन प्रक्रिया के माध्यम से आधे रास्ते को रोकता है। – o11c

+2

संबंधित (संभावित डुप्ली): [मैक का कोई सीकेपी विस्तार बिना टोकन-स्ट्रिंग के साथ] (http://stackoverflow.com/questions/30813619/cpp-expansion-of-macro-with-no-token-string/30813841#30813841) –

+0

ध्यान दें कि अक्सर रिक्ति सी या सी ++ में कोई फर्क नहीं पड़ता। – MicroVirus

उत्तर

6

प्रीप्रोकैसिंग का परिणाम स्रोत फ़ाइल को टोकन की सूची में बदलना है। आपके मामले में टोकन की सूची दिखाई देगी, tokenization के बाद:

.... 
booboo() 
bbb 
.... 

और उसके बाद मैक्रो प्रतिस्थापन के बाद:

.... 
aaa 
bbb 
.... 

फिर संकलक एक निष्पादन में टोकन की सूची अनुवाद करता है।

जो सफेद स्थान आप देख रहे हैं वह सिर्फ एक कार्यान्वयन विस्तार है कि आपके कंपाइलर इत्यादि ने आपको मध्यवर्ती परिणाम प्रदर्शित करते समय प्रीप्रोकैसिंग टोकन डालने का विकल्प चुना है। मानक किसी भी मध्यवर्ती प्रसंस्करण फ़ाइलों के बारे में कुछ भी नहीं कहते हैं। यह आवश्यक नहीं है कि प्रीप्रोकैसिंग करने के लिए एक अलग कार्यक्रम हो।

+4

@ ब्लूमून को बिल्कुल अलग प्रीप्रोसेसर होने की आवश्यकता नहीं है, इसलिए इसे कुछ भी करने की ज़रूरत नहीं है। अनुवाद के प्रीप्रोकैसिंग चरणों को सिर्फ टोकन की एक सूची बनाने के रूप में निर्दिष्ट किया जाता है, जो फ़ाइल का उत्पादन नहीं करता है। "प्रीप्रोसेसर आउटपुट" स्रोत फ़ाइल और निष्पादन योग्य के बीच एक मध्यवर्ती चरण है। –

+0

@ मैट: मैं आपके उत्तर को sth (ehoho बेहतर) के रूप में दोहरा दूंगा: "प्रीप्रोसेसिंग का लक्ष्य स्रोत फ़ाइल को टोकन की सूची में बदलना है जो तब कंपाइलर इनपुट बन जाता है। आपके मामले में (टोकननाइज़ेशन के बाद) टोकन की सूची इस तरह दिखेगा "और यह नहीं कहेंगे 'बूबू()' एक टोकन है लेकिन 3 टोकन है। बाकी स्पष्ट और अच्छा है। – Artur

+1

@ ब्लू चंद्रमा: "बिल्कुल अलग प्रीप्रोसेसर होने की आवश्यकता नहीं है" यह अलग है "यह सच है कि प्रोसेसर होने की आवश्यकता नहीं है"। मैट का कहना है कि कंपाइलर को प्रीप्रोसेसर के आउटपुट को देखने की ज़रूरत नहीं है जिस तरह से इसे हमें (मनुष्यों) को प्रस्तुत किया जाना चाहिए। कंपाइलर केवल टोकन की जरूरत है, कोई जगह नहीं। प्रीप्रोसेसर की सुविधा जो इसे अपने काम के आउटपुट परिणामों को पूरी तरह से मनुष्यों के लिए अनुमति देती है ताकि हम डीबग कर सकें ... और कम सिर खरोंच कर सकते हैं ;-) – Artur

-1

मैंने 90 के दशक में स्वयं एक एएनएसआई सी संकलक लिखा था। जहां तक ​​मुझे याद है, एक टिप्पणी टोकन/....../एक सफेद-स्थान द्वारा प्रतिस्थापित किया जाना चाहिए। मैक्रोज़ जगह में पाठ प्रतिस्थापन करते हैं। यह आवश्यक नहीं है कि इस तरह के मैक्रो विस्तार (टेक्स्ट) के पाठ प्रतिस्थापन के परिणामस्वरूप टोकन कानूनी सी भाषा टोकन हों। जब एक मैक्रो को 'aaa' टेक्स्ट के रूप में परिभाषित किया जाता है तो यह केवल 'aaa' टेक्स्ट होता है जो इनपुट स्ट्रीम में अपना रास्ता बनाता है। सी के पार्सर के परिणामस्वरूप वैध टोकन देख सकते हैं या नहीं!

इसलिए दिया:

booboo() aaa

विस्तार booboo() bbb

क्या कि aaabbb मतलब उपयोगकर्ता पर निर्भर है करता aaabbb पाठ में परिणाम चाहिए परिभाषित करते हैं। लेकिन अगर मैक्रो का नाम होता है तो भी अबाबब प्रीप्रोसेस्ड नहीं किया जाएगा। यह पक्का है। लेकिन aaabbb उपयोगकर्ता पहचानकर्ता हो सकता है - कोई समस्या नहीं है।

+2

यह विभिन्न टोकन को जोड़ देगा, जो नहीं होता है। – Eiko

+1

टोकन को संयोजित करने के लिए एक अलग निर्देश '##' है। – MicroVirus

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