2010-03-12 18 views
15

प्रिंटफ अपने तर्कों को कैसे संभालता है? मुझे पता है कि सी # में मैं कुछ ऐसा करने के लिए params कीवर्ड का उपयोग कर सकता हूं लेकिन मैं इसे सी में नहीं कर सकता?प्रिंटफ अपने तर्कों को कैसे संभालता है?

उत्तर

17

इस तरह के एक समारोह को variadic function कहा जाता है। आप ... का उपयोग कर सी में एक घोषित कर सकता है, इसलिए जैसे:

int f(int, ...); 

फिर आप va_start, va_arg, और va_end उपयोग कर सकते हैं तर्क सूची के साथ काम करने के लिए। यहाँ एक उदाहरण है:

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

void f(void); 

main(){ 
     f(); 
} 

int maxof(int n_args, ...){ 
     register int i; 
     int max, a; 
     va_list ap; 

     va_start(ap, n_args); 
     max = va_arg(ap, int); 
     for(i = 2; i <= n_args; i++) { 
      if((a = va_arg(ap, int)) > max) 
       max = a; 
     } 

     va_end(ap); 
     return max; 
} 

void f(void) { 
     int i = 5; 
     int j[256]; 
     j[42] = 24; 
     printf("%d\n",maxof(3, i, j[42], 0)); 
} 

अधिक जानकारी के लिए कृपया The C Book और stdarg.h देखते हैं।

+2

आपका उदाहरण गलत है और काम नहीं करता है, क्योंकि यह सी वाक्य रचना करने के लिए विपरीत है समर्थन करता है। हो सकता है कि आपने एक टाइपो बनाया हो और अंडरस्कोर भूल गए? – psihodelia

+0

इसके अलावा, उल्लेख '# शामिल ' अच्छा होगा। –

+0

फिक्स्ड, प्रतिक्रिया के लिए धन्यवाद। –

8

इस सुविधा को कहा जाता है 0 फ़ंक्शन में तर्कों की परिवर्तनीय संख्या। आप stdarg.h हेडर फाइल शामिल करने के लिए है, तो अपने समारोह के मुख्य भाग में va_list प्रकार और va_start, va_arg, और va_end कार्यों का उपयोग:

void print_arguments(int number_of_arguments, ...) 
{ 
    va_list list; 
    va_start(list, number_of_arguments); 
    printf("I am first element of the list: %d \n", va_arg(list, int)); 
    printf("I am second element of the list: %d \n", va_arg(list, int)); 
    printf("I am third element of the list: %d \n", va_arg(list, int)); 
    va_end(list); 
} 

तो इस तरह से अपनी फ़ंक्शन को कॉल करें:

print_arguments(3,1,2,3); 

जो होगा निम्नलिखित प्रिंट आउट:

I am first element of the list: 1 
    I am second element of the list: 2 
    I am third element of the list: 3 
+2

क्या आपका मतलब 'print_arguments (3,1,2,3)' था? – bk1e

+0

@ बीके 1e: धन्यवाद, मैंने एक टाइपो किया है; अद्यतन किया है – psihodelia

7

अन्य लोगों की तरह कहा है, printf va_args का उपयोग करता है कार्य करने के लिए। प्रिंटफ के अपने संस्करण को लिखने के लिए यह एक बहुत अच्छा अभ्यास है, अगर प्रिंटफ को सत्यापित करने के लिए कुछ और नहीं है, तो पास्कल के लेखन के विपरीत कंपाइलर जादू नहीं है। ऐसा करने के बाद, आपको इससे दूर चलना चाहिए। यहाँ एक blog article मैं ब्यौरा क्यों (संक्षिप्त उत्तर आप कीड़े एक लंबे समय के लिए चल पाता जा सकते हैं जो बना सकता है) ने लिखा है।

4

और सिर्फ कहानी जीसीसी (सुनिश्चित करें कि अन्य compilers के बारे में नहीं) को पूरा करने के

#define FUNC(X,Y,...) wiz(X,Y, ##__VA_ARGS__) 

variadic मैक्रो अनुमति देने के लिए

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