2009-11-12 12 views
39

मैं एक ऐसा फ़ंक्शन लिखने की कोशिश कर रहा हूं जो प्रिंटफ जैसे पैरामीटर की एक चर संख्या को स्वीकार करता है, कुछ सामान करता है, फिर चरम सूची को printf में पास करता है। मुझे यकीन नहीं है कि यह कैसे करें, क्योंकि ऐसा लगता है कि इसे उन्हें ढेर पर धक्का देना होगा।सी प्रोग्रामिंग: फॉरवर्ड वेरिएबल तर्क सूची

लगभग इस

http://pastie.org/694844

#include <stdio.h> 
#include <stdarg.h> 

void forward_args(const char *format , ...){ 
    va_list arglist; 
    printf(format, arglist); 
} 


int main (int argc, char const *argv[]){ 
    forward_args("%s %s\n" , "hello" , "world"); return 0; 
} 

कोई भी विचार की तरह कुछ?

+4

शायद आप और जॉन एक ही कक्षा में हैं? http://stackoverflow.com/questions/1714550/how-can-one-variable-args-function-call-another –

+2

संभावित डुप्लिकेट [सी में एक वैरिएडिक फ़ंक्शन का आमंत्रण अग्रेषित करें) (http://stackoverflow.com/प्रश्न/150543/फॉरवर्ड-ए-इनवोकेशन-ऑफ-ए-वैरैडिक-फ़ंक्शन-इन-सी) – dmckee

उत्तर

49

परिणाम printf पर न भेजें। उन्हें vprintf पर पास करें। vprintf विशेष रूप से va_list तर्कों में गुजरने के लिए मौजूद है।

#include <stdio.h> 

int printf(const char *format, ...); 
int fprintf(FILE *stream, const char *format, ...); 
int sprintf(char *str, const char *format, ...); 
int snprintf(char *str, size_t size, const char *format, ...); 

#include <stdarg.h> 

int vprintf(const char *format, va_list ap); 
int vfprintf(FILE *stream, const char *format, va_list ap); 
int vsprintf(char *str, const char *format, va_list ap); 
int vsnprintf(char *str, size_t size, const char *format, va_list ap); 

सूचना कैसे उत्तरार्द्ध स्पष्ट रूप से इस तरह के हैं जिन्हें आप एक समारोह पैरामीटर सूची में ... लेने के अंदर की घोषणा के रूप में va_list तर्क ले: लिनक्स आदमी पृष्ठ से। तो आपका फ़ंक्शन इस तरह घोषित किया जाएगा:

void forward_args(const char *format , ...){ 
    va_list arglist; 
    va_start(arglist, format); 
    vprintf(format, arglist); 
    va_end(arglist); 
} 
+1

ठीक है, उसे 'va_start() 'और' va_end() 'भी चाहिए। –

+0

@ केन ब्लूम: आप सही हैं। फिक्स्ड। – quark

+4

'va_start (arglist, प्रारूप)' –

2

आप इसे उपभोग करने के लिए डिज़ाइन किए गए फ़ंक्शन के लिए आर्किगिस्ट मान के साथ गुज़रेंगे। अधिक सुराग के लिए stdarg और vprintf दस्तावेज देखें।

-1

मैं इसे लागू करने के तरीके से परिचित (मेरे सिर के ऊपर से) नहीं हूं। मैं प्रिंटफ जैसे कार्यों के कार्यान्वयन को देखने का सुझाव दूंगा। कई खुले स्रोत कार्यान्वयन मौजूद हैं। glibc, uclibc (यकीन नहीं है कि बीएसडी और opensolaris कॉल/उनके libc के लिए उपयोग)।

3

मैं बहुत यकीन है कि आप के लिए va_start()/vprintf()/vsnprintf()/va_end() देख रहे हैं रहा हूँ, इन अपने आप को लागू करने के लिए कोई जरूरत नहीं है।

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