linux - How to use va_list object in a nested way, especially on gcc x64 compiler -


कृपया मेरे छोटे सी / सी ++ प्रोग्राम के माध्यम से देखें।

  // va_nest.c # शामिल करें & lt; stdarg.h & gt; # शामिल करें & lt; stdio.h & gt; Void nest2 (const char * fmt, ...) {va_list args2, args_dig; Int * pi, i; Va_start (आर्ग्स 2, एफएमटी); Args_dig = va_arg (args2, va_list); // !!! नेस्टेड va_list ऑब्जेक्ट को लाने की कोशिश करें Pi = va_arg (args_dig, int *); मैं = va_arg (args_dig, int); Printf ("आंतरिक: @% पी,% d \ n", पी, आई); va_end (args2); } Void nest1 (const char * fmt, ...) {va_list args1; Va_start (आर्ग्स 1, एफएमटी); नेस्ट 2 (एफएमटी, आरजीएस 1); va_end (args1); } Int main () {int var = 11; Printf ("बाहरी: @% पी,% d \ n", & amp; var, var); नेस्ट 1 ("एबीसी", & amp; var, var); वापसी 0; }  

ओपनस्यूस 13.1 एक्स 86 पर, यह सिर्फ मुझे उम्मीद करना चाहता है (जीसीसी या जी ++ का उपयोग करने की कोई बात नहीं),

  बाहरी: @ 0xbfa18d8c, 11 इनर: @ 0xbfa18d8c, 11  

हालांकि, यह ओपनस्यूस 13.1 x 64 मशीन पर x86_64 कंपाइलर के साथ विफल रहता है।

अगर मैं इसे जीसीसी से संकलित करता हूं, तो ठीक है, लेकिन उत्पादन अप्रत्याशित है।

  $ gcc -o vac va_nest.c $ ./vac बाहरी: @ 0x7fffb20f766c, 11 आंतरिक: @ 0x1b01000000636261, 4209411  

अगर मैं इसे g ++ से संकलित करता हूं, तो यह भी संकलन करने में विफल रहता है।

  $ g ++ -o vacpp va_nest.c va_nest.c: फ़ंक्शन में 'void nest2 (Const char *, ...) ': va_nest.c: 12: 11: त्रुटि: अमान्य सरणी असाइनमेंट args_dig = va_arg (args2, va_list); ^  

जीसीसी और जी ++ संस्करण 4.8.1 है

क्या कोई मुझे उस के साथ मदद कर सकता है? मुझे उम्मीद है कि एक्स 64 पर लिनक्स एक्स 86 कंपाइलर के रूप में एक ही परिणाम प्राप्त करना होगा।

va_list के साथ चतुर। इसके बजाय, इस तरह कोड का उपयोग करें:

  नेस्ट 2 (एफएमटी, एजीआर 1);  

(यानी सुनिश्चित करें कि सभी फ़ंक्शन va_list के पीछे छिपी एक समान संरचना का उपयोग करें) तो आप दूसरे फ़ंक्शन को इस तरह परिभाषित कर सकते हैं:

  void nest2 (const char * fmt, va_list args1)  

यह भी सुनिश्चित करें कि आप Va_end () ठीक एक बार घोंसले के शिकार मज़बूती से काम नहीं करेगा (यानी अगर यह काम करता है, तो इससे कुछ और अधिक भाग्य होगा)।

संदेह में, विशेष रूप से और GLIBC के स्रोत कोड को देखें।

 < कोड> int __fprintf (FILE * स्ट्रीम, const char * प्रारूप, ...) {va_list arg; पूरा किया; Va_start (आर्ग, प्रारूप); किया = vfprintf (स्ट्रीम, प्रारूप, आर्ग); Va_end (आर्ग); वापसी किया; }  

और बाद में:

  int vfprintf (FILE * s, const CHAR_T * प्रारूप, va_list एपी) { 
< / div>

Comments