2012-08-27 20 views
6

मेरे कोड इस तरह के टुकड़े शामिल हैं:SBRM/std :: va_list/va_start() के लिए आरए II/va_end का उपयोग

std::va_list ap; 
    va_start(ap, msgfmt); 
    snprintf_buf buf; 
    const tchar * msg = buf.print_va_list(msgfmt, ap); 
    va_end(ap); 

ये छोटी होती हैं और va_start() और va_end() एक साथ करीब हैं तो वे बड़ी समस्या नहीं हैं । दोनों के बीच कॉल से अपवाद एक समस्या हो सकती है (या नहीं?)।

सरल परीक्षण से पता चलता है कि va_start() को बिना किसी इलिप्सिस के फ़ंक्शन से कॉल करने की अनुमति नहीं है। va_start() की तुलना में va_end() को किसी भिन्न फ़ंक्शन से कॉल करने की अनुमति है या नहीं?

असल में, मैं उत्सुक अगर यह इन कॉल के लिए SBRM/आरए II मुहावरा उपयोग करना संभव है कर रहा हूँ, भले ही यह आवश्यक थे va_start() मैन्युअल कॉल करने के लिए और फिर मेरी आरए II/SBRM गार्ड उदाहरण में std::va_list के कहने पारित करने के लिए?

उत्तर

6

दुर्भाग्य से, नहीं। va_start और va_end के विनिर्देश की आवश्यकता है कि:

va_start और va_copy मैक्रो से प्रत्येक मंगलाचरण ही समारोह में va_end मैक्रो के एक इसी मंगलाचरण से मिलान किया जाएगा।

इसलिए, va_end क्लास विनाशक नहीं, बल्कि विविधता कार्य में होना चाहिए।

+0

उद्धरण कहां से है? – wilx

+0

@ विल्क्स: सी 99 मानक, 7.15.1/1। –

0

संभावित कार्यान्वयन में से एक मानता है std :: va_list = char * और va_end() बस उस पॉइंटर को शून्य पर सेट कर रहा है। कारण से, इसे फ़ंक्शन के बाहर बुलाया जा सकता है। लेकिन मुझे यकीन नहीं है कि यह अन्य प्लेटफॉर्म पर समान काम करेगा।

कक्षाओं के साथ इस कार्य को लपेटने के लिए बेहतर है।