मैं सी में एक समारोह है कि बहस के परिवर्तनशील लेता है लिख रहा हूँ।सी varargs - va_copy मुद्दों
size_t myprintf(char *fmt, ...);
अभी तक, बहुत अच्छा है। मैंने फैसला किया है कि राइट वे ™ चीजों को करने के लिए सबसे अच्छा है और एक ऐसा संस्करण बनाएं जो परिवर्तनीय तर्क लेता है, और दूसरा संस्करण जो va_list
लेता है।
size_t myprintf(char *fmt, ...);
size_t myvprintf(char *fmt, va_list args);
ऐसा करना मुश्किल नहीं है। (जब हम इतना कक्ष आवंटित किया है पहले snprintf()
को 0 से लंबाई निर्धारित करने के लिए हम कितना कमरे की जरूरत के साथ, तो sprintf()
करने के लिए) को छोड़कर my_vprintf()
अपने दो के लिए बाहर args
विभिन्न कार्यों को भेजने के लिए की जरूरत है। मैं इसे va_copy
के साथ करता हूं।
size_t myvprintf(char *fmt, va_list args)
{
va_list args2;
va_copy(args, args2);
// do stuff with args2
va_end(args2);
// do more stuff with args
}
यह सब ठीक और बेवकूफ है, लेकिन सी 99 थोड़ा खराब कार्यान्वित किया गया है। यदि संभव हो, तो मेरे कोड के लिए सी 8 9 में काम करने के लिए, और जितना संभव हो सके उतने प्लेटफॉर्म पर काम करने के लिए मैं चाहूंगा। मैं वर्तमान में #include <stddef.h>
के बाद यह है, लेकिन किसी भी कोड से पहले:
#ifndef va_copy
# ifdef __va_copy
# define va_copy(a,b) __va_copy(a,b)
# else /* !__va_copy */
# define va_copy(a,b) ((a)=(b))
# endif /* __va_copy */
#endif /* va_copy */
मुझे विश्वास है कि ((a)=(b))
अविश्वसनीय है, और मैं शायद memcpy()
या कुछ इसी तरह का उपयोग करना चाहिए कि नेतृत्व कर रहा हूँ, लेकिन यह अभी भी "आप तो के स्तर पर है सी 99 का समर्थन न करें, मुझे उम्मीद है कि यह "बजाए" काम करता है यदि आप सी 99 का समर्थन नहीं करते हैं, तो कभी डर न करें "(जो मैं चाहता हूं)। क्या इस सीमा को पाने के लिए कोई अच्छा तरीका है? दो बार va_list
कार्यों कि एक तर्क और recurse खाते हैं, va_list
गुजर इतना है कि दो अलग-अलग प्रतियां, बना रहे हैं आदि - - मैं कुछ समाधान को देखा है लेकिन मैं नहीं जानता कि वे कितने कारगर होते हैं (और पुनरावर्ती समाधान जीता ' अगर मैं सिर्फ vsnprintf()
पर कॉल करना चाहता हूं तो यह बहुत अच्छा होगा, अब, क्या यह होगा?)।
तो मैं, आप के लिए बारी StackOverflow उपयोगकर्ता। वहाँ कुछ भी अधिक मैं C89 अनुकूलता प्रदान करने के लिए क्या कर सकते हैं, या va_copy
और __va_copy
(वैसे कुछ और दूर के बीच) बस में यह चूसना और इसे लेने के लिए जा रहा बिना उन रहे हैं है?
यह 200 9 है। आपको अभी भी सी 8 9 संगतता की आवश्यकता क्यों है? – stepancheg
क्योंकि वीसी ++ (और शायद नहीं) इसका समर्थन करता है। और मुझे यह पसंद है। मुझे लगता है कि यह एक अच्छी बात है। –
मुझे लगता है कि एमएस वास्तव में रिकॉर्ड के रूप में कहता है कि उनके पास सी 99 के लिए जाने का कोई इरादा नहीं है, इसके अलावा उनके ग्राहकों की इच्छाओं को चुनने और चुनने के अलावा। – KTC