c++ - Why no error is thrown on declaring vector of vector of int using #define -
#include & lt; bits / stdc ++। H & gt; नेमस्पेस एसटीडी का उपयोग करना; #define vi vector & lt; int & gt; # परिभाषित वीवी वेक्टर & lt; vi & gt; Int main () {vi v (10, -1); वीवी वीवी (10, वी); के लिए (int i = 0; i & lt; vv.size (); i ++) {for (int j = 0; j & lt; vv [i]। आकार (); j ++) {cout & lt; & lt; वीवी [i] [जे] & lt; & lt; ""; } Cout & lt; & lt; endl; }} जब मैं उपरोक्त कोड को संकलित करता हूं, कोई त्रुटि नहीं की जाती है और यह ठीक () चलाता है। लेकिन जब मैं vector & lt का उपयोग कर सदिश के वेक्टर का एक सदिश घोषित करता हूं; वेक्टर & lt; Int> gt> एक त्रुटि उत्पन्न होती है क्योंकि मैंने सही कोण ब्रैकेट के बीच स्थान नहीं रखा है तो पहले मामले में कोई त्रुटि क्यों नहीं है, जब #define करता है तो vi के साथ वेक्टर gt; और < कोड> वीवी के साथ vector & lt; वेक्टर के & lt; पूर्णांक & gt; & gt; ?
कारण आपको #define विधि से त्रुटि नहीं मिल रही है यह है कि प्रीप्रोसेसर बुद्धिमानी से टूटता है। अगर आप उस कोड को केवल पूर्वप्रोसेसर चरण (उदाहरण के लिए जीसीसी-ए ) से गुज़रते हैं, तो आप कुछ ऐसा देखेंगे: int main () {vector & lt; पूर्णांक & gt; वी (10, -1); वेक्टर के & lt; वेक्टर & LT; पूर्णांक & gt; & Gt; vv (10, वी); // & lt; & lt; - यहां अंतरिक्ष देखें। के लिए (int i = 0; i & lt; vv.size (); i ++) {for (int j = 0; j & lt; vv [i]। आकार (); j ++) {cout & lt; & lt; वीवी [i] [जे] & lt; & lt; ""; } Cout & lt; & lt; endl; } वापसी 0; }
कारण ऐसा क्यों होता है, आईएसओ सी ++ मानक के आधार पर अनुवाद के चरणों के साथ क्या होता है। सी ++ 11 की धारा 2.2 (ए) बताता है कि नौ अनुवाद चरणों हैं। चरण 3 स्रोत फाइल का विभाजन पूर्वप्रक्रमित टोकन और सफेद स्थान में है। महत्वपूर्ण बात यह है कि टोकनवाद है, ताकि वेक्टर & lt; vi & gt; प्रीप्रोसेसिंग टॉकेन्स का सेट {वेक्टर, & lt ;, vi, & gt;} , मैक्रो प्रतिस्थापन अनुभाग में सरलीकृत पाठ को नहीं है जबकि एक सरलीकृत टेक्स्ट प्रतिस्थापन: #define vi vector & lt; int & gt; # परिभाषित वीवी वेक्टर & lt; vi & gt; Vvi xyzzy; का परिणाम निम्न होगा:
वेक्टर & lt; vector & lt; int & gt; & gt; xyzzy; क्या आप वास्तव में के साथ समाप्त होता है प्रीप्रोसेटिंग टोकन सेट है: {वेक्टर, & lt ;, vector, & lt; , Int, & gt ;, & gt ;, WHITESPACE, xyzzy,;} फिर, चरण 7 में मानक मानक:
प्रत्येक प्रसंस्करण टोकन है एक टोकन में परिवर्तित।
इसलिए स्रोत के एक सरल रीडिंग के बावजूद दो & gt; टॉकेन को एक एकल में पुन: संयोजन नहीं किया जा सकता है
(ए) ध्यान रखें कि, हालांकि मैं मानक के सी + + 11 भागों का हवाला दे रहा हूं ताकि यह सुनिश्चित हो सके कि उत्तर अधिक है- तिथि, यह विशेष समस्या सी ++ 03 एक है सी ++11 वास्तव में पार्सर को ठीक करता है ताकि एकाधिक & gt; वर्ण एक टेम्पलेट तर्क सूची को बंद कर दें जहां उचित (सी + 03 03 हमेशा इसे सही-शिफ्ट ऑपरेटर के रूप में माना जाता है)। < P> C ++ 11 14.2, अनुभाग 3 यह निर्दिष्ट करता है: जब कोई टेम्पलेट-तर्क-सूची पार्स करता है, तो पहले गैर-नेस्टेड & gt; < / कोड> ऑपरेटर की तुलना में अधिक से अधिक होने की बजाय अंतराल के रूप में लिया जाता है। इसी तरह, पहले गैर-नेस्टेड & gt; & gt; दो लगातार लेकिन अलग & gt; टोकन के रूप में माना जाता है ...
Comments
Post a Comment