va_end
सफाई के लिए उपयोग किया जाता है। आप ढेर को तोड़ना नहीं चाहते हैं, है ना?
man va_start
से
:
va_end()
va_start से प्रत्येक मंगलाचरण() va_end() एक ही समारोह में के एक इसी मंगलाचरण से मिलान किया जाना चाहिए। कॉल va_end (एपी) के बाद चर एपी अपरिभाषित है। सूची के एकाधिक ट्रैवर्सल, प्रत्येक va_start() और va_end() द्वारा ब्रैकेट किए गए हैं। va_end() एक मैक्रो या एक समारोह हो सकता है।
शब्द की उपस्थिति होना चाहिए।
ढेर दूषित हो सकता है क्योंकि आपको नहीं पता कि va_start()
कर रहा है। va_*
मैक्रोज़ का मतलब काले बक्से के रूप में किया जाना है। प्रत्येक मंच पर प्रत्येक कंपाइलर जो कुछ भी चाहता है वह कर सकता है। यह कुछ भी नहीं कर सकता है, या यह बहुत कुछ कर सकता है।
कुछ एबीआई रजिस्टरों में पहले कुछ तर्क पास करते हैं, और बाकी स्टैक पर जाते हैं। एक va_arg()
और अधिक जटिल हो सकता है। आप देख सकते हैं कि दिए गए कार्यान्वयन में विविधताएं होती हैं, जो दिलचस्प हो सकती हैं, लेकिन पोर्टेबल कोड लिखने में आपको उन्हें अपारदर्शी संचालन के रूप में देखना चाहिए।
यह वास्तव में एक अच्छा सवाल है। मेरी इच्छा है कि कोई आर्किटेक्चर का वर्णन करके इसका उत्तर देगा जहां va_end नो-ऑप नहीं है। – erikkallen
एफवाईआई: एमएसवीएस 2008 - #define _crt_va_end (एपी) (एपी = (va_list) 0) – Yarik
@erikkallen: "परिभाषित va_end" के लिए एक Google खोज करें और आपको कुछ असामान्य परिभाषाएं मिलेंगी जो अनिवार्य रूप से नो- सेशन। – PlasmaHH