2014-07-17 13 views
18

C++ में:सी ++ ज़ोर: एक दर्शाते हैं उनमें अभिव्यक्ति की पूर्वता मैक्रो

assert( std::is_same<int , int>::value ); // does not compile 

    assert((std::is_same<int , int>::value)); // compiles 

किसी को भी बताएगा कि ऐसा क्यों कर सकते हैं?

+4

मैक्रो उपेक्षा संकलक अर्थ विज्ञान (उन अभी तक अस्तित्व में नहीं है जब मैक्रो का विस्तार कर रहे हैं)। आप अल्पविराम से अलग कुछ भी पारित कर सकते हैं। – chris

+0

यह ध्यान देने योग्य है कि ये ब्रांड्स चार [बूस्ट पीपी डेटा प्रकार] (http://www.boost.org/doc/libs/1_55_0/libs/preprocessor/doc/index.html) संभव बनाते हैं। – chris

+3

'std :: is_same' एक संकलन-समय की जांच है, इसलिए यह रन-टाइम जोर देने के लिए बहुत अधिक समझ में नहीं आता है! इसके बजाए संकलन-समय पर जोर दें। सी ++ में 11 [static_assert] है (http://en.cppreference.com/w/cpp/language/static_assert), अन्यथा अभी भी [बहुत सारे विकल्प] हैं (http://stackoverflow.com/questions/174356/तरीके-से-assert-expressions-at-build-time-in-c) –

उत्तर

11

कॉमा को मैक्रो के लिए एक तर्क विभाजक के रूप में माना जा रहा है, लेकिन आपके दूसरे मामले में कोष्ठक तर्कों की रक्षा करता है।

बाहर सबसे मिलान कोष्ठकों से घिरा preprocessing टोकन के अनुक्रम की सूची का निर्माण करती है: हम मानक खंड 16.3मैक्रो प्रतिस्थापन जो कहते हैं (जोर मेरा) मसौदा सेल्सियस तक ++ जाकर यह देख सकते फ़ंक्शन-जैसे मैक्रो के लिए तर्क। सूची में व्यक्तिगत तर्कों को अल्पविराम प्रीप्रोकैसिंग टोकन, से अलग किया गया है, लेकिन मिलान करने वाले बीच के बीच अल्पविराम प्रीकोकैसिंग टोकन तर्कों को अलग नहीं करते हैं। preprocessing टोकन के दृश्यों तर्कों की सूची है कि अन्यथा पूर्व प्रसंस्करण निर्देशों के रूप में अधिनियम, 154 व्यवहार अपरिभाषित है के भीतर नहीं हैं, तो

हम देख सकते हैं कि मैक्रो विस्तार अर्थगत विश्लेषण से पहले होता है अनुभाग 2.2पर जाकर अनुवाद के चरण और देखते हैं कि चरण 4 में शामिल हैं:

preprocessing निर्देशों क्रियान्वित कर रहे हैं, मैक्रो आमंत्रण का विस्तार कर रहे हैं, और [...] सभी preprocessing निर्देशों तो नष्ट हो जाती हैं ।

और चरण 7 में शामिल हैं:

[...] प्रत्येक preprocessing टोकन एक टोकन में बदल जाती है। (2.7)। जिसके परिणामस्वरूप टोकन वाक्य रचना और अर्थ की दृष्टि से विश्लेषण किया जाता है और एक अनुवाद इकाई के रूप में अनुवाद [...]

एक तरफ ध्यान दें हम बूस्ट देख सकते हैं इस स्थिति से निपटने के लिए एक विशेष मैक्रो में शामिल हैं: BOOST_PP_COMMA:

BOOST_PP_COMMA मैक्रो एक अल्पविराम में फैलता है।

और कहते हैं:

पूर्वप्रक्रमक मैक्रो आमंत्रण में तर्क अल्पविरामों और विभाजकों व्याख्या करता है। इस वजह से, अल्पविरामों को विशेष हैंडलिंग की आवश्यकता होती है।

और एक उदाहरण:

BOOST_PP_IF(1, BOOST_PP_COMMA, BOOST_PP_EMPTY)() // expands to , 
14

assert एक प्रीप्रोसेसर मैक्रो है। प्रीप्रोसेसर मैक्रोज़ गूंगा हैं; वे टेम्पलेट्स को समझ में नहीं आता है।

assert(std :: is_same < int , int > :: value); 

यह अल्पविराम में विभाजन: पूर्वप्रक्रमक कोष्ठकों के भीतर 10 टोकन देखता है। यह नहीं जानता कि यह विभाजित करने के लिए गलत जगह है, क्योंकि यह समझ में नहीं आता है कि std::is_same<int और int>::value मान्य C++ अभिव्यक्ति नहीं हैं।

प्रीप्रोसेसर कई तर्कों में ब्रांड्स के आंतरिक जोड़े की सामग्री को तोड़ने के लिए पर्याप्त स्मार्ट नहीं है। यही कारण है कि अतिरिक्त कोष्ठक जोड़ना समस्या को हल करता है।

+5

इसके अलावा एक 'static_assert' यहां पर्याप्त है: 'static_assert (std :: is_same :: मान," ओओएस "); ' – quantdev

+0

यह सिर्फ टेम्पलेट्स नहीं है। न तो ब्रेसिज़ और न ही ब्रैकेट अल्पविराम की रक्षा करते हैं। अभिभावक और उद्धरण करते हैं। – rici

+0

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

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