5

सी 11 मानक के अनुसार, फ़ंक्शन-जैसे मैक्रो के तर्क में शुरुआत में या इसके प्रीप्रोकैसिंग टोकन अनुक्रम के अंत में व्हाइटस्पेस हो सकता है। सामान्य प्रतिस्थापन के लिए, इस तरह के रिक्त स्थान पर कोई प्रभाव नहीं पड़ता है। स्ट्रिंगफिकेशन के लिए, 6.10.3.2.2सी preprocessor मैक्रो तर्क समाप्ति के लिए अंत में अंतरिक्ष के साथ?

पहले प्रीप्रोकैसिंग टोकन से पहले व्हाइट स्पेस और तर्क को लिखने वाले अंतिम प्रीप्रोकैसिंग टोकन के बाद रिक्त स्थान को अनदेखा किया जाना चाहिए।

(जो मेरा मानना ​​है कि यह भी। एक सबूत साबित तर्क इसके चारों ओर रिक्त स्थान हो सकता है है) और सवाल तर्क है कि ## ऑपरेटर द्वारा श्रेणीबद्ध किया जाएगा, इसके बारे में क्या कर रिक्त स्थान संकलक चाहिए क्या है?

मैंने इसे वीसी ++ के साथ करने की कोशिश की, जो केवल रिक्त स्थान को अनदेखा करता है।

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

तो वीसी ++ ने पहले उल्लेख किए अनुसार क्या किया है, क्या यह केवल अंतरिक्ष को अनदेखा व्यवहार के परिणाम या अनदेखा करने का नतीजा है?

उत्तर

4

जो मेरा मानना ​​है कि यह भी एक सबूत साबित तर्क यह

नहीं के साथ स्पेस हो सकता है, वास्तव में यह केवल मानक के प्रावधान है कि प्रत्येक मैक्रो तर्क preprocessing टोकन के अनुक्रम (है पुष्ट है सी2011, 6.10.3/11)। स्रोत फ़ाइल में व्हाइटस्पेस प्रीप्रोकैसिंग टोकन को अलग करता है; व्हाइटस्पेस के रन खुद को टोकन को प्रीप्रोसेसिंग नहीं कर रहे हैं।

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

इसका मतलब यह नहीं है कि प्रीप्रोकैसिंग टोकन व्हाइटस्पेस से शुरू या समाप्त हो सकता है। यह नहीं कर सकता; पूर्ण विवरण के लिए मानक के खंड 6.4 देखें।कैसे दिया गया कार्यान्वयन स्ट्रिंग के लिए विनिर्देशों को पूरा करता है, यह आवश्यक रूप से क्रियान्वयन विशिष्ट है, लेकिन एक तरह से एक कार्यान्वयन ऐसा कर सकता है जिसमें प्रत्येक प्रीप्रोकैसिंग टोकन के लिए बूलियन झंडे को बनाए रखने में शामिल किया गया है, यह बताते हुए कि टोकन पहले से है और व्हाईटस्पेस द्वारा स्रोत अनुक्रम में पालन किया गया है या नहीं। इस तरह के विवरण के परिणाम के लिए मानक निर्दिष्ट करता है, न तो स्ट्रिंगफिकेशन ऑपरेटर के लिए और न ही टोकन पेस्टिंग ऑपरेटर के लिए।

तर्कों के लिए जो ## ऑपरेटर द्वारा समेकित किया जाएगा, कंपाइलर को इसकी रिक्त स्थान के बारे में क्या करना चाहिए?

समय ## ऑपरेटर (या # ऑपरेटर) के द्वारा, खेलने में आता है संकलक पहले से ही सब कुछ है कि यह कभी नहीं होगा किया है (सीधे) अंतरिक्ष पात्रों में से tokenization के दौरान उन्हें ध्यान में रखते हुए, स्रोत फ़ाइल में प्रदर्शित होने के साथ क्या preprocessing टोकन में स्रोत। मैक्रो तर्क प्रीप्रोकैसिंग टोकन के अनुक्रम हैं, और केवल इतना हद तक कि उन टोकन स्ट्रिंग या वर्ण अक्षर या हेडर नाम हो सकते हैं, जिनमें वे व्हाइटस्पेस हो सकते हैं। इसके अलावा, मानक निर्दिष्ट करता है:

, तो एक समारोह की तरह मैक्रो के प्रतिस्थापन सूची में, एक पैरामीटर तुरंत पहले या एक ## टोकन preprocessing द्वारा पीछा किया जाता, पैरामीटर इसी तर्क के टोकन preprocessing ने ले ली है अनुक्रम [...]

(C2011, 6.10.3.3/2; जोर जोड़ा)

एक बार फिर, खाली स्थान के रन preprocessing नहीं कर रहे हैं टोकन। मैक्रो विस्तार और # और ## ऑपरेटरों प्रीप्रोसेसिंग टोकन के अनुक्रमों के स्तर पर काम करते हैं, और संचालन करते हैं। Whitespace केवल इस स्तर पर आंतरिक रूप से टोकन के भीतर प्रतिनिधित्व किया जाता है। स्रोत फ़ाइल से व्हाइटस्पेस जो प्रीप्रोकैसिंग टोकन के लिए आंतरिक नहीं है, प्रीप्रोकैसिंग टोकन अनुक्रम में केवल अप्रत्यक्ष रूप से और अनिश्चित रूप से दर्शाया गया है।

+0

मैं देखता हूं। अपने जवाब के लिए आपको बहुत बहुत धन्यवाद। लेकिन मुझे आश्चर्य है, अगर कंपाइलर में अपने तर्क के प्रीप्रोकैसिंग टोकन अनुक्रम में श्वेत स्थान शामिल नहीं है, तो यह स्ट्रिंगफिकेशन कैसे करेगा? मेरा मतलब है, यह कैसे पता होना चाहिए कि आसन्न प्रीप्रोकैसिंग टोकन के बीच सफेद जगह कहां रखना है और कहां नहीं। मुझे लगता है कि यह न केवल टोकन अनुक्रम रिकॉर्ड करता है बल्कि सफेद रिक्त स्थान के बारे में भी जानकारी देता है? इसके बारे में मानक क्या कहता है? –

+0

@WuZhenwei, आप सही हैं कि स्ट्रिंगिफिकेशन प्रीप्रोकैसिंग टोकन के बीच व्हाइटस्पेस नहीं डालता है जहां स्रोत वर्ण अनुक्रम में कोई भी नहीं है। चूंकि प्रीप्रोसेसर परवाह नहीं है * कितने * व्हाइटस्पेस है या विशिष्ट जगहों के स्पेस ऐसे स्थानों में क्या हैं, यह टोकन-बाय-टोकन आधार पर ट्रैक कर सकता है कि टोकन पहले से हैं और/या व्हाइटस्पेस के बाद हैं। यह एक कार्यान्वयन विस्तार है। मैं स्पष्टीकरण के लिए अपना जवाब अपडेट करूंगा। –

3

6.10.3.3/3

प्रतिस्थापन सूची से पहले

को बदलने के लिए अधिक मैक्रो नाम के लिए पुनर्परीक्षण होते है, की एक ## प्रतिस्थापन सूची (एक तर्क से नहीं) में preprocessing टोकन हटा दी जाती है प्रत्येक उदाहरण और पिछले preprocessing टोकन निम्नलिखित preprocessing टोकन के साथ concatenated है।

तो ## दो प्रीप्रोकैसिंग टोकन को जोड़ता है। यह अप्रासंगिक है कि वे राइट्स स्पेस से लिया गया तर्क है।

+0

क्या आपका मतलब यह अनिश्चित व्यवहार है कि वीसी ++ अंतरिक्ष को अनदेखा कर रहा है? (मेरे प्रश्न की अंतिम वाक्य देखें।) –

+1

@WuZhenwei नहीं, मुझे इसका कोई मतलब नहीं है। आपकी आखिरी वाक्य अमान्य आधार पर आधारित है, अर्थात्, प्रीप्रोसेसर को व्हाइटस्पेस को जोड़ना चाहिए। मानक में कुछ भी नहीं है जो ऐसा कहता है। –

+0

धन्यवाद। मैंने सोचा कि सफेद जगह भी एक प्रीप्रोसेसिंग टोकन हो सकती है। –

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