सी ++ मैक्रोज़ सरल टेक्स्ट प्रतिस्थापन हैं।
जब संकलक शुरू होता है, तो आपके LOGIC_ONE
को प्रीकंपेलर द्वारा 1
द्वारा पहले से ही बदल दिया गया है। यह वही है जैसे आपने 1
तुरंत लिखा होगा।
आप (या उपयोग के साथ किसी और को अपने कोड के लिए) बदलता है, तो अपने #define LOGIC_ONE 1
#define LOGIC_ONE "1"
के लिए इसे बदल जाएगा: टिप्पणी में चर्चा शामिल करने के लिए
संपादित करें (जो, इस मामले में, एक पूर्णांक शाब्दिक है ...) आपके कार्यक्रम में इसका व्यवहार और const char[]
शाब्दिक बन गया।
संपादित करें:
के बाद से इस पोस्ट और अधिक ध्यान मेरी अपेक्षा से मिला है, मुझे लगता है मैं संदर्भ C++ 14 Standard करने के लिए उन उत्सुक के लिए जोड़ने के बारे में सोचा:
2,2 अनुवाद के चरण [lex.phases]
(...)
4. प्रीप्रोकैसिंग निर्देश निष्पादित किए जाते हैं, मैक्रो इनवॉक्शंस का विस्तार किया जाता है, और _Pragma unary ऑपरेटर अभिव्यक्ति निष्पादित की जाती है। (...) सभी प्रीप्रोकैसिंग निर्देश हटा दिए जाते हैं।
(...)
7. टोकन को अलग करने वाले व्हाइट-स्पेस वर्ण अब महत्वपूर्ण नहीं हैं। प्रत्येक प्रीप्रोकैसिंग टोकन को टोकन में परिवर्तित किया जाता है। (2.6)। परिणामी टोकन वाक्य रचनात्मक रूप से और अर्थात् विश्लेषण और अनुवाद इकाई के रूप में अनुवादित हैं।
जैसा कि कहा गया है, मैक्रोज़ चरण 4 में बदल दिए गए हैं और बाद में मौजूद नहीं हैं। "Syntactical और semantical" चरण 7 चरण में होता है, जहां कोड संकलित हो जाता है ("अनुवादित")।
पूर्णांक शाब्दिक
2.13.2 पूर्णांक शाब्दिक में निर्दिष्ट [lex.icon]
(...)
एक पूर्णांक शाब्दिक कोई अवधि या प्रतिपादक है कि अंक का एक क्रम है भाग, वैकल्पिक अलगाव एकल कोट्स के साथ जो इसके मूल्य को निर्धारित करते समय अनदेखा कर दिया जाता है। एक पूर्णांक अक्षर में एक उपसर्ग हो सकता है जो इसके आधार और प्रत्यय निर्दिष्ट करता है जो इसके प्रकार को निर्दिष्ट करता है।
(...)
टेबल 5 - पूर्णांक शाब्दिक के प्रकार
Suffix | Decimal literal | Binary, octal, or hexadecimal literal
-----------------------------------------------------------------------------
none | int | int
| long int | unsigned int
| long long int | long int
| | unsigned long int
| | long long int
| | unsigned long long int
-----------------------------------------------------------------------------
u or U | unsigned int | unsigned int
| unsigned long int | unsigned long int
| unsigned long long int | unsigned long long int
-----------------------------------------------------------------------------
l or L | long int | long int
| long long int | unsigned long int
| | long long int
| | unsigned long long int
-----------------------------------------------------------------------------
Both u or U | unsigned long int | unsigned long int
and l or L | unsigned long long int | unsigned long long int
-----------------------------------------------------------------------------
ll or LL | long long int | long long int
| unsigned long long int
-----------------------------------------------------------------------------
Both u or U |unsigned long long int | unsigned long long int
and ll or LL | |
स्ट्रिंग शाब्दिक
2.13.5 स्ट्रिंग शाब्दिक [lex.string] में निर्दिष्ट कर रहे हैं
(...)
1 एक स्ट्रिंग-शाब्दिक अक्षरों का अनुक्रम है (जैसा कि 2.13.3 में परिभाषित किया गया है) डबल कोट्स से घिरा हुआ है, वैकल्पिक रूप से आर, यू 8, यू 8 आर, यू, यूआर, यू, यूआर, एल, आरएलआर द्वारा पूर्ववर्ती " ... ", आर" (...) ", u8" ... ", u8R" ** (...) ** ", आप" ... ", यूआर" * ~ (...) * ~ ", यू" ... ", यूआर" zzz (...) zzz ", एल" ... ", या एलआर" (...) "क्रमशः।
(...)
6 अनुवाद चरण 6 के बाद, एक स्ट्रिंग-शाब्दिक जो एन्कोडिंग-उपसर्ग के साथ शुरू नहीं होता है वह सामान्य स्ट्रिंग अक्षर है, और दिए गए वर्णों के साथ प्रारंभ किया जाता है।
7 एक स्ट्रिंग-शाब्दिक जो u8 के साथ शुरू होता है, जैसे u8 "asdf", एक यूटीएफ -8 स्ट्रिंग अक्षर है।
8 सामान्य स्ट्रिंग अक्षर और यूटीएफ -8 स्ट्रिंग अक्षर को भी संकीर्ण स्ट्रिंग अक्षर के रूप में जाना जाता है। एक संकीर्ण स्ट्रिंग शाब्दिक में "" सरणी है, जहां n नीचे परिभाषित स्ट्रिंग का आकार है, और स्थैतिक संग्रहण अवधि (3.7) है।
में एक असली गड़बड़ में प्राप्त करने के लिए देखने के लिए क्या पूर्वप्रक्रमक, संकलक को -E' पारित करता है 'के लिए एक त्वरित तरीका है। (एमएसवीसी, जीसीसी, क्लैंग सभी स्वीकार करते हैं '-ई') – Ben