यहां C99 standard है; "आत्म-प्रचार" प्रकार वे हैं जो डिफ़ॉल्ट तर्क प्रचार (§6.5.2.2 अनुच्छेद 6, §6.3.1.1 में वर्णित पूर्णांक पदोन्नति का संदर्भ देने) के लिए स्वयं को बढ़ावा देते हैं।
va_arg
परिभाषा (§7.15.1.1) की मेरी पढ़ाई यह है कि यह सीमा मानक द्वारा निहित है। प्रासंगिकता का पैरा 2 में है:
[...] या यदि प्रकार (के रूप में डिफ़ॉल्ट तर्क प्रोन्नति के लिए अनुसार पदोन्नत) नहीं वास्तविक अगले तर्क के प्रकार के साथ संगत है [... ]
जो वास्तविक अगले तर्क के प्रकार के बारे में प्रचारित किया जा रहा काफी स्पष्ट है, लेकिन मैं के रूप में यह नहीं कह पढ़ें कुछ भी के बारे में प्रकार प्रचारित किया जा रहा। (मुझे लगता है कि "(प्रचारित ...)" खंड केवल एक अनुस्मारक है कि जब एक varargs फ़ंक्शन कहा जाता है तो ट्रेलिंग तर्कों पर डिफ़ॉल्ट तर्क प्रचार किया जाता है।)
यह आइटम § में अपरिभाषित व्यवहार की सूची में है J.2 इस पढ़ने का समर्थन करता है:
- जब वहाँ कोई वास्तविक अगले तर्क है, या एक निर्दिष्ट प्रकार है कि वास्तविक अगले तर्क के पदोन्नत प्रकार के साथ संगत नहीं है, कुछ के साथ साथ va_arg
मैक्रो शुरू हो जाती है अपवाद (7.15.1.1)।
(हालांकि हाँ, मुझे पता है, अनुलग्नक जे "मानक" के बजाय "जानकारीपूर्ण" है ...)।
जो मामले में: va_arg(ap, float)
(उदाहरण के लिए) मान्य नहीं हो सकता है - उस मामले में प्रकारfloat
है, लेकिन वास्तविक अगले तर्क की पदोन्नत प्रकार संभवतः नहीं हो सकता float
(एक float
तर्क double
करने के लिए प्रोत्साहित किया जाता था)।
स्रोत
2011-01-13 00:33:52
क्या इस प्रतिबंध के लिए कोई विशेष कारण है? शायद 'va_arg' अपूर्णता के साथ कुछ करने के लिए? –
@ क्रिप्टो: मुझे संदेह है कि जैक सही है (जेन्स को उसकी प्रतिक्रिया देखें); अनुपालन से विशेष सहायता के बिना किसी दिए गए प्रकार के डिफ़ॉल्ट तर्क पदोन्नति को खोजने का कोई स्पष्ट तरीका नहीं है, इसलिए यह 'va_arg (ap, type)' के कार्यान्वयन की अनुमति देता है जो ऐसी सहायता के बिना काम करता है। (उदाहरण के लिए 'एपी' में स्टैक पर वर्तमान तर्क के लिए बाइट पॉइंटर रखें; फिर 'va_arg' कुछ भयानक मैक्रो हो सकता है जो कि' टाइप * 'के लिए कास्टिंग करके अगले तर्क पर जाता है,' टाइप * 'पॉइंटर को बढ़ाता है, और एक बाइट पॉइंटर को वापस कास्टिंग।) –