2016-02-13 8 views
9

यदि मै मैक्रो को #define LOGIC_ONE 1 के रूप में परिभाषित करता हूं और LOGIC_ONE को केस स्टेटमेंट में उपयोग करना चाहता हूं, तो LOGIC_ONE किस प्रकार माना जाता है?मैक्रो किस प्रकार माना जाता है?

क्या यह int के रूप में पहचाना गया है क्योंकि मैं इसे मूल्य 1 के लिए परिभाषित कर रहा हूं?

+1

में एक असली गड़बड़ में प्राप्त करने के लिए देखने के लिए क्या पूर्वप्रक्रमक, संकलक को -E' पारित करता है 'के लिए एक त्वरित तरीका है। (एमएसवीसी, जीसीसी, क्लैंग सभी स्वीकार करते हैं '-ई') – Ben

उत्तर

19

सी ++ मैक्रोज़ सरल टेक्स्ट प्रतिस्थापन हैं।

जब संकलक शुरू होता है, तो आपके 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) है।

+0

आईई। मैं 'LOGIC_ONE' का इलाज कर सकता हूं जैसे कि यह 'int' है? वर्तमान मूल्य के लिए – Noobgineer

+0

@Noobgineer हाँ, लेकिन अगर कोई इसे '1 "' –

+2

में बदल देता है तो आप इसे किसी भी तरह से इलाज कर सकते हैं जिस तरह से आप' 1' 'का इलाज कर सकते हैं- हां, यह एक शाब्दिक है। – Anedar

8

LOGIC_ONE को हर जगह 1 स्थान पर बदल दिया गया है। जहां तक ​​कंपाइलर का संबंध है LOGIC_ONE मौजूद नहीं है, यह केवल 1 देखता है। तो आपका प्रश्न '1 int है?'। इसका उत्तर है -> यह निर्भर करता है कि आप कहां टाइप करते हैं 1

+0

ठीक है। मुझे नहीं पता था कि संकलक '1' या' LOGIC_ONE' के लिए दिखता है या नहीं। सफाई देने के लिए धन्यवाद! – Noobgineer

6

एक मैक्रो एक टेक्स्ट प्रतिस्थापन है। 1constexpr int प्रकार का है।

11

प्रीप्रोसेसर परिभाषित करने के लिए कोई प्रकार नहीं है - वे मौलिक रूप से केवल उस कोड में चिपकाए गए हैं जहां वे दिखाई देते हैं। उदाहरण के लिए, आप इसे कथन में उपयोग करते हैं;

int foo = LOGIC_ONE; 

फिर इसे पूर्णांक के रूप में व्याख्या किया जाएगा। (प्रीप्रोसेसर के बाद चलने वाला कंपाइलर, उस कोड को int foo = 1; के रूप में देखता है) आप इसे एक गहन कथन में भी उपयोग कर सकते हैं;

int foo##LOGIC_ONE; 

फिर आप एक चर foo1 बनायेंगे। युक!

मैक्रो परिभाषा का एक वैकल्पिक उदाहरण लें;

#define LOGIC_ONE hello 
int LOGIC_ONE = 5; 
printf("%d\n", hello); 

कि पूरी तरह से वैध है, और किसी पूर्णांक नमस्ते कहा जाता वाणी है, लेकिन पता चलता वहाँ कोई परिभाषित करता है के लिए "प्रकार" है कि - hello केवल प्रतिस्थापित किया गया जहाँ भी LOGIC_ONE कोड में आई थी।

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

static const int LOGIC_ONE = 1; 
enum { LOGIC_ONE = 1 }; 

पूर्वप्रक्रमक एक नौसिखिया सी

+1

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

+0

मैंने सोचा कि टोकन पेस्टिंग केवल मैक्रो तर्कों के साथ काम करता है, और सामान्य रूप से मैक्रोज़ पर लागू नहीं किया गया था? – supercat

+0

मैक्रोज़ के बहुत सीमित उपयोग के अलावा कुछ भी सलाह सी ++ में 10 गुना है (जिसे यह प्रश्न टैग किया गया है)। मैक्रोज़ के साथ जो कुछ भी हो सकता है, उसके बारे में निश्चित रूप से एक बेहतर प्रकार का सुरक्षित तरीका है। फ़ाइल समावेशन, गार्ड और सशर्त संकलन शामिल हैं पूर्व प्रसंस्करण के शेष मुख्य रहता है। – Persixty

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