आप स्पष्ट रूप से va_arg
मैक्रो fprintf
(7.19.6.1/9) के लिए दस्तावेज में, <stdarg.h>
से उपयोग करने के लिए एक पैरामीटर है कि एक int
(7.15.1.1/2) के रूप में एक unsigned
के रूप में पारित किया गया था को पुनः प्राप्त करने की अनुमति है हालांकि जो printf
पर भी लागू होता है, यह स्पष्ट रूप से बताता है कि यदि कोई तर्क प्रारूप विनिर्देशक के लिए सही प्रकार नहीं है - एक अनमोडिफाइड %d
के लिए, यह int
है - तो व्यवहार परिभाषित नहीं किया गया है।
एक टिप्पणी में @bdonlan नोटों के रूप में, अगर (कुछ N
के लिए इस मामले 2^N - 1
में) b
का मूल्य तो यह अपरिभाषित व्यवहार होगा का उपयोग कर एक int
के रूप में मूल्य का उपयोग करने के प्रयास करने के लिए एक int
में प्रदर्शनीय नहीं है किसी भी मामले में va_arg
। यह केवल प्लेटफ़ॉर्म पर काम करेगा जहां unsigned
का प्रतिनिधित्व कम से कम एक पैडिंग बिट का उपयोग करता है जहां संबंधित int
प्रतिनिधित्व का संकेत बिट था।
यहां तक कि इस मामले में जहां (unsigned)-1
का मूल्य एक int
में व्यक्त किया जा सकता है, मैं अभी भी इस तकनीकी रूप से अपरिभाषित व्यवहार होने के रूप में पढ़ा है। कार्यान्वयन के हिस्से के रूप में, printf
पर पैरामीटर तक पहुंचने के लिए va_args
के बजाय जादू में निर्मित उपयोग के कार्यान्वयन के लिए इसे लागू करने की अनुमति दी जाएगी और यदि आप unsigned
के रूप में कुछ पास करते हैं, जहां int
आवश्यक है तो आपने तकनीकी रूप से अनुबंध का उल्लंघन किया है printf
।
स्रोत
2011-05-01 21:37:49
7.15 में अपवाद .1.1/2 निम्नानुसार पढ़ता है: "यदि प्रकार वास्तविक अगली तर्क के प्रकार के साथ संगत नहीं है [...], व्यवहार अवांछित है, सिवाय इसके कि एक प्रकार एक हस्ताक्षरित पूर्णांक प्रकार है, दूसरा प्रकार है संबंधित हस्ताक्षरित पूर्णांक प्रकार, _ और मान दोनों प्रकारों में प्रतिनिधित्व योग्य है "(जोर मेरा)। चूंकि '-1' दोनों प्रकारों में प्रतिनिधित्व योग्य नहीं है, व्यवहार 7.19.6.1/9 – bdonlan
@bdonlan के बिना भी अपरिभाषित है: तकनीकी रूप से' बी' के पास मान '-1' नहीं है, इसमें मूल्य' 2^N है कुछ 'एन' के लिए -1'। चाहे यह मान 'int' और 'हस्ताक्षरित' दोनों में प्रतिनिधित्व योग्य है प्लेटफार्म निर्भर है - आमतौर पर नहीं, मैं आपको प्रदान करता हूं। –
यदि कोई व्यवहार केवल अपरिभाषित है, तो कुछ कार्यान्वयन-परिभाषित कारक सत्य हैं, तो यह प्रभावी ढंग से अपरिभाषित है, क्योंकि एक अनुरूप कार्यान्वयन INT_MAX और UINT_MAX का मान चुनने के लिए स्वतंत्र है जो इसे प्रिंटफ़ कॉल पर नाक राक्षसों को बुलाएगा। – bdonlan