हाँ आप इसे कर सकते हैं, लेकिन यह कुछ हद तक बदसूरत है और आपको तर्कों की अधिकतम संख्या जाननी है। इसके अलावा यदि आप एक आर्किटेक्चर पर हैं जहां तर्क x86 (उदाहरण के लिए, पावरपीसी) जैसे स्टैक पर पारित नहीं होते हैं, तो आपको यह जानना होगा कि "विशेष" प्रकार (डबल, फ्लोट्स, altivec आदि) का उपयोग किया जाता है और यदि तो, तदनुसार उनके साथ सौदा। यह जल्दी दर्दनाक हो सकता है लेकिन यदि आप x86 पर हैं या यदि मूल फ़ंक्शन में अच्छी तरह से परिभाषित और सीमित परिधि है, तो यह काम कर सकता है। यह अभी भी एक हैक होगा, इसे डीबगिंग उद्देश्य के लिए उपयोग करें। उस के आसपास सॉफ्टवेयर बनाओ मत। वैसे भी, यहाँ 86 पर एक काम उदाहरण है:
#include <stdio.h>
#include <stdarg.h>
int old_variadic_function(int n, ...)
{
va_list args;
int i = 0;
va_start(args, n);
if(i++<n) printf("arg %d is 0x%x\n", i, va_arg(args, int));
if(i++<n) printf("arg %d is %g\n", i, va_arg(args, double));
if(i++<n) printf("arg %d is %g\n", i, va_arg(args, double));
va_end(args);
return n;
}
int old_variadic_function_wrapper(int n, ...)
{
va_list args;
int a1;
int a2;
int a3;
int a4;
int a5;
int a6;
int a7;
int a8;
/* Do some work, possibly with another va_list to access arguments */
/* Work done */
va_start(args, n);
a1 = va_arg(args, int);
a2 = va_arg(args, int);
a3 = va_arg(args, int);
a4 = va_arg(args, int);
a5 = va_arg(args, int);
a6 = va_arg(args, int);
a7 = va_arg(args, int);
va_end(args);
return old_variadic_function(n, a1, a2, a3, a4, a5, a6, a7, a8);
}
int main(void)
{
printf("Call 1: 1, 0x123\n");
old_variadic_function(1, 0x123);
printf("Call 2: 2, 0x456, 1.234\n");
old_variadic_function(2, 0x456, 1.234);
printf("Call 3: 3, 0x456, 4.456, 7.789\n");
old_variadic_function(3, 0x456, 4.456, 7.789);
printf("Wrapped call 1: 1, 0x123\n");
old_variadic_function_wrapper(1, 0x123);
printf("Wrapped call 2: 2, 0x456, 1.234\n");
old_variadic_function_wrapper(2, 0x456, 1.234);
printf("Wrapped call 3: 3, 0x456, 4.456, 7.789\n");
old_variadic_function_wrapper(3, 0x456, 4.456, 7.789);
return 0;
}
किसी कारण के लिए, आप va_arg साथ तैरता उपयोग नहीं कर सकते, जीसीसी कहते हैं कि वे लेकिन कार्यक्रम दुर्घटनाओं दोगुना करने के लिए बदल रहे हैं। वह अकेला दर्शाता है कि यह समाधान एक हैक है और कोई सामान्य समाधान नहीं है। मेरे उदाहरण में मैंने माना कि तर्कों की अधिकतम संख्या 8 थी, लेकिन आप उस संख्या को बढ़ा सकते हैं। लपेटा हुआ फ़ंक्शन भी केवल पूर्णांक का उपयोग करता है लेकिन यह अन्य 'सामान्य' पैरामीटर के साथ उसी तरह काम करता है क्योंकि वे हमेशा पूर्णांक में डालते हैं। लक्ष्य कार्य उनके प्रकारों को जानेंगे लेकिन आपके मध्यस्थ रैपर को इसकी आवश्यकता नहीं है। रैपर को तर्कों की सही संख्या जानने की भी आवश्यकता नहीं है क्योंकि लक्ष्य कार्य इसे भी जानता है। उपयोगी काम करने के लिए (केवल कॉल लॉगिंग को छोड़कर), आपको शायद दोनों को जानना होगा।
भयानक सवाल - सौभाग्य से मैं एक vFunc अधिभार कि एक va_list लेता है जोड़ सकते हैं। पोस्ट करने का शुक्रिया। – Gishu