2010-08-14 20 views
5

मैंने हाल ही में सी ++ में संकलन-समय के दावे की आवश्यकता पर ध्यान दिया कि यह जांचने के लिए कि दो प्रकार के आकार बराबर थे।सी ++ में संकलन-समय सम्मिलन?

#define X_ASSERT(condition) ((void)sizeof(char[1 - 2*!!(condition)])) 

जो मैं बहुत की तरह इस्तेमाल किया:

मैं वेब पर निम्न मैक्रो (कहा लिनक्स कर्नेल से आए हैं) में पाया गया

X_ASSERT(sizeof(Botan::byte) != sizeof(char)); 

यह मैं उत्सुक हो जाता है - यह हालांकि काम करता है, क्या ऐसा करने का एक क्लीनर तरीका है? (जाहिर है कि एक से अधिक तरीके हैं, जैसा कि यह है) क्या कुछ तरीकों के फायदे या नुकसान हैं?

+0

सभी जवाब हर किसी के लिए धन्यवाद, बहुत ही दिलचस्प। मुझे यह देखने में प्रसन्नता हो रही है कि सी ++ 0x को 'static_assert' मिल रहा है, मुझे पहले इसके बारे में पढ़ने की याद नहीं है। ;) –

उत्तर

6

आप Boost StaticAssert पर एक नज़र डालना चाहते हैं। आंतरिक बिल्कुल सही नहीं हैं (या आखिरी बार मैंने देखा नहीं था) लेकिन कम से कम यह अधिक पहचानने योग्य है, इसलिए अधिकांश लोगों को पता है कि इसका क्या अर्थ है। अगर मेमोरी परोसता है तो यह अधिक दर्दनाक त्रुटि संदेश उत्पन्न करने के लिए कुछ दर्द भी जाता है।

+3

मैं वास्तव में ['BOOST_MPL_ASSERT_MSG'] पसंद करता हूं (http://www.boost.org/doc/libs/1_43_0/libs/mpl/doc/refmanual/assert-msg.html)। – GManNickG

10

सी ++ 0x में, एक नई भाषा सुविधा है, static_assert, जो संकलन-समय के दावे उत्पन्न करने का एक मानक तरीका प्रदान करता है। उदाहरण के लिए,

static_assert(sizeof(Botan::byte) != 1, "byte type has wrong size"); 

विजुअल C++ 2010, static_assert का समर्थन करता है के रूप में क्या जी ++ 4.3 (और अधिक से अधिक) और इंटेल सी ++ 11.0।

0

वहाँ एक उत्कृष्ट #error पूर्वप्रक्रमक निर्देश (इसके बारे में एक अच्छा निबंध के लिए here देखें) है, लेकिन मेरा मानना ​​है कि यह रूप में इस्तेमाल किया जा रहा करने के लिए विरोध एक #if भीतर होने की जरूरत है एक "बिना आधार के" अपने उदाहरण उपयोग में के रूप में।

+3

'# त्रुटि' का नुकसान यह है कि यह एक प्रीप्रोसेसिंग निर्देश है और स्रोत का विश्लेषण करने से पहले इसका मूल्यांकन किया जाता है, और आप नियंत्रण '# अगर' निर्देश में 'आकार' या गैर-मैक्रो स्थिरांक जैसी चीजों का उपयोग नहीं कर सकते हैं। –

1

कुछ अन्य रोचक विकल्प यहाँ हैं: http://www.jaggersoft.com/pubs/CVu11_3.html

लेखक के रूप में साफ पढ़ने सी (नहीं सी ++) विशिष्ट जानकारी चलता सिंटैक्स संकलन समय दावे के रूप में किया जा सकता है की तलाश में।

1

ऐसा करने के लिए दाएं आपको एक सी ++ 0x अनुकूल कंपाइलर की आवश्यकता है, जेम्स मैकनेलिस और जेरी कॉफ़िन्स उत्तर दें।

आप 1998 या 2003 सी ++ मानकों के साथ बहुत कुछ नहीं कर सकते हैं। उदाहरण के लिए इन लिंक पर एक नज़र डालें:

http://en.wikipedia.org/wiki/Assertion_(computing)#Static_assertions http://ksvanhorn.com/Articles/ctassert.html

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