Uint_64_t से va_list तक गलत तरीके से गुजरना
मैं एक कस्टम printfफ़ंक्शन लिख रहा हूं और uint64_tलगता है कि गलत तरीके से पारित किया जा सकता है va_list:
समस्यात्मक बिंदु:
printf("Number is %C, and the next one is %C", 0xff00ffb7, 0xffffffff);
मेरे printfकार्यान्वयन का एक हिस्सा जो गलत परिणाम उत्पन्न करता है:
format++;
uint64_t num = va_arg(parameters, uint64_t);
जब gdb के साथ डिबगिंग numहो जाता है, जिसके 0xffffffffff00ffb7बजाय 0xff00ffb7मैं अपेक्षा करता हूं, और अगले के लिए %C num0. बन जाता है। क्या यह कुछ मानक व्यवहार मुझे याद आ रहा है या मैं कुछ गलत कर रहा हूं?
जवाब
यदि एक वैरिएड फ़ंक्शन के लिए 0xff00ffb7होना है uint64_t, तो उसे कास्ट करें।
printf("Number is %C", (uint64_t) 0xff00ffb7);
0xff00ffb7एक पूर्णांक निरंतर रूप में, के प्रकार है int, unsigned, long, unsigned long, long long, या unsigned long longपहले एक यह "फिट":। 32-बिट के साथ int/unsigned, ओपी की परेशानी का स्रोत 0xff00ffb7होगा unsigned।
जोड़ uएक निरंतर करने के लिए एक है अच्छा यह कुछ अहस्ताक्षरित प्रकार है बीमा करने के लिए विचार।
स्थिरांक का बीमा कराना Lया LLस्थिरांक लगाना एक अच्छा विचार नहीं है uint64_t। या तो मेल कर सकते हैं ( LLअक्सर), लेकिन ये प्रत्यय उस प्रकार की गारंटी नहीं देते हैं।
UINT64_C(0xff00ffb7)एक प्रकार के रूपों का उपयोग करना uint_least64_tजो निश्चित रूप uint64_tसे मशीनों पर समान है uint64_t।