2010-01-13 14 views
22

संभव डुप्लिकेट:
C Programming: Forward variable argument list.क्या एक varargs फ़ंक्शन लिखना संभव है जो इसे किसी अन्य varargs फ़ंक्शन पर तर्क सूची भेजता है?

मुझे क्या करना चाहते हैं एक प्रवेश पुस्तकालय (है कि मैं modfify नहीं कर सकता) जिस तरह की एक printf वस्तु के रूप में करने के लिए डेटा भेजने के लिए है।

void log_DEBUG(const char* fmt, ...) { 
    char buff[SOME_PROPER_LENGTH]; 
    sprintf(buff, fmt, <varargs>); 
    log(DEBUG, buff); 
} 

मैं किसी तरह से एक और vararg कार्य करने के लिए varargs पारित कर सकते हैं:

तो मैं इस तरह एक समारोह कुछ करना चाहते हैं?

+1

शिकार: http://stackoverflow.com/questions/1719784/c-programming-forward-variable-argument-list –

उत्तर

25

आप परिवर्तनीय तर्क सूची को अग्रेषित नहीं कर सकते हैं, क्योंकि ... के नीचे किसी अन्य फ़ंक्शन में पैरामीटर (ओं) के नीचे क्या व्यक्त करने का कोई तरीका नहीं है।

हालांकि आप ... मापदंडों से एक va_list निर्माण और कहा कि एक समारोह है जो इसे ठीक तरह से स्वरूपित जाएगाभेज सकते हैं। यह vsprintf है। उदाहरण:

void log_DEBUG(const char* fmt, ...) { 
    char buff[SOME_PROPER_LENGTH]; 
    va_list args; 
    va_start(args, fmt); 
    vsprintf(buff, fmt, args); 
    va_end(args); 
    log(DEBUG, buff); 
} 
+1

मत भूलना ** va_end ** –

+0

@ निकोलई एन Fetissov: धन्यवाद, तय। –

+3

मुझे यहां कुछ भी मानक नहीं दिख रहा है। –

3

मानक सी ++ में नहीं।

+0

ठीक है, C++ इसका इस्तेमाल के लिए बेहतर होगा '' << – ezpz

7

यही कारण है कि आपके पास vprintf फ़ंक्शन का परिवार है।

4

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

13

आप इसे किसी अन्य फ़ंक्शन पर भेज सकते हैं जो एक तर्क के रूप में va_list लेता है। हस्तनिर्मित एएसएम का उपयोग करने के लिए कोई दूसरा रास्ता नहीं है, या पैरामीटर की 'संख्या' को समझने के लिए किसी प्रकार का भयावह अनुमान लगाने वाला गेम नहीं है।

यह काम करेगा:

void log_DEBUG(const char* fmt, ...) 
{ 
    va_list va; 
    va_start(va,fmt); 
    char buff[blah]; 
    vsprintf(buff,fmt,va); 
    log(DEBUG,buff); 
    va_end(va); 
} 

मूल रूप से, जब भी आप एक समारोह है कि लेता है ... लिखते हैं, आप एक और संस्करण है कि एक va_list लेता है लिखना चाहिए - अगर आपने उसे सक्षम करना चाहते हैं अपने विनम्र बात करने के लिए चेनिंग कॉल का प्रकार।

+0

वास्तव में मुझे क्या चाहिए मैं सोच रहा था कि शायद सीधे तर्क सूची पास करने के लिए कुछ रास्ता था, लेकिन बनामप्रिंटफ अच्छी तरह से करेगा! –

+0

स्वीकार्य उत्तर "vsprintf" बिंदु से चूक गया, यही कारण है कि कई लोग (inc me) इस उत्तर को Google पर लाएंगे। – perfectionist

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