2012-04-27 13 views
5

मैं मैक्रोज़ के बारे में कुछ कोड के लिए देख रहा था, और मैं इस तरह के कोड पाया, मैक्रो «va_start» के लिए:stdarg.h में मैक्रो «__va_size» क्यों है?

#define __va_argsiz(t) \ 
    (((sizeof(t) + sizeof(int) - 1)/sizeof(int)) * sizeof(int)) 
#define va_start(ap, pN) \ 
    ((ap) = ((va_list) (&pN) + __va_argsiz(pN))) 

मैं पता है कि «__va_argsiz» समारोह के लक्ष्य को वास्तव में चाहते हैं। क्या यह संरेखण सीमाएं है?

धन्यवाद!

+1

आपका प्रश्न हमें उस मंच के ब्योरे के बिना ज्यादा समझ में नहीं आता है जहां आपको यह मिला। –

उत्तर

3

में डिफ़ॉल्ट प्रकार पदोन्नति नियम ऐसा लगता है कि यह, पहले तर्क के आकार के आधार चर तर्क सूची के शुरू होने से गणना करने के लिए प्रयोग किया जाता है। पहला तर्क आवश्यक सामान्य है, यानी printf() के लिए यह स्वरूपण स्ट्रिंग का सूचक होगा।

1

इसका उपयोग variable length arguments के लिए किया जाता है। उदाहरण के लिए printf ऐसी चर लंबाई लंबाई सूची का उपयोग करता है। __va_argsiz सूची के आकार की गणना करता है और va_start शुरुआत निर्धारित करता है।

1

कोई "सीमा", कार्यान्वयन__va_argsizराउंडsizeof(t), एक प्रकार t के लिए, sizeof(int) के गुणकों में। इसकी आवश्यकता है क्योंकि varargs फ़ंक्शन कॉल प्रोटोकॉल के हिस्से के रूप में कॉल स्टैक पर पारित किए गए उकसाने वाले तर्क स्वचालित रूप से गठबंधन किए जाते हैं और sizeof(int) (स्पष्ट रूप से, आपके प्लेटफ़ॉर्म पर) के गुणकों में स्थान आवंटित किए जाते हैं, और वहां से ठीक से पुनर्प्राप्त किया जाना चाहिए।

http://www.cplusplus.com/reference/clibrary/cstdarg/va_start/ भी देखें।

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