2009-08-11 17 views
6

मैं सी में एक समारोह है कि बहस के परिवर्तनशील लेता है लिख रहा हूँ।सी 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 (वैसे कुछ और दूर के बीच) बस में यह चूसना और इसे लेने के लिए जा रहा बिना उन रहे हैं है?

+0

यह 200 9 है। आपको अभी भी सी 8 9 संगतता की आवश्यकता क्यों है? – stepancheg

+0

क्योंकि वीसी ++ (और शायद नहीं) इसका समर्थन करता है। और मुझे यह पसंद है। मुझे लगता है कि यह एक अच्छी बात है। –

+0

मुझे लगता है कि एमएस वास्तव में रिकॉर्ड के रूप में कहता है कि उनके पास सी 99 के लिए जाने का कोई इरादा नहीं है, इसके अलावा उनके ग्राहकों की इच्छाओं को चुनने और चुनने के अलावा। – KTC

उत्तर

3

(a)=(b) अविश्वसनीय है। यहां तक ​​कि दो va_list गुजर रहा है (सार्वजनिक समारोह एक सरल आवरण होगा) के रूप में va_list कुछ की तरह हो सकता है:

typedef __va_list_impl va_list[1]; 

जिसके लिए एक पर एक va_arg कर अन्य को संशोधित किया जाएगा (मुझे लगता है कि इस तरह के सोलारिस का उपयोग याद करने लगते हैं चीज की तरह, आह, रजिस्टर विंडोज़ ...)। अफसोस की बात है, मुझे पता है कि आप जो चाहते हैं उसे करने का कोई निश्चित तरीका नहीं है।

+0

मुझे इससे डर था। ओह अच्छा।मुझे लगता है कि करने के लिए उचित काम मेरी हैक-'va_copy' को '#error" में बदलना होगा एक नया कंपाइलर प्राप्त करें "' –

+0

इस विशेष मामले में va_copy मैक्रो में असाइनमेंट विफल हो जाएगा, क्योंकि आप एक सरणी असाइन नहीं कर सकते अन्य को। – caf

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