हाँ, आप इसे कर सकते हैं, लेकिन यह कुछ हद तक बदसूरत है और आपको अधिकतम तर्कों को जानना होगा। इसके अलावा अगर आप किसी ऐसे आर्किटेक्चर पर हैं जहाँ तर्कों को x86 की तरह पास नहीं किया जाता है (उदाहरण के लिए, PowerPC), तो आपको यह जानना होगा कि क्या "विशेष" प्रकार (डबल, फ्लोट, अल्टिवक आदि) का उपयोग किया जाता है और यदि इसलिए, उनके अनुसार व्यवहार करें। यह जल्दी से दर्दनाक हो सकता है लेकिन अगर आप x86 पर हैं या यदि मूल फ़ंक्शन में अच्छी तरह से परिभाषित और सीमित परिधि है, तो यह काम कर सकता है।
यह अभी भी एक हैक होगा , इसे डीबगिंग उद्देश्य के लिए उपयोग करें। उस के आसपास आप सॉफ्टवेयर का निर्माण न करें। वैसे भी, यहाँ x86 पर एक कार्यकारी उदाहरण दिया गया है:
#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 के साथ फ़्लोट्स का उपयोग नहीं कर सकते, gcc का कहना है कि वे डबल में परिवर्तित हो जाते हैं लेकिन प्रोग्राम क्रैश हो जाता है। यह अकेला दर्शाता है कि यह समाधान हैक है और कोई सामान्य समाधान नहीं है। मेरे उदाहरण में मैंने माना कि अधिकतम संख्या में तर्क 8 थे, लेकिन आप उस संख्या को बढ़ा सकते हैं। लिपटे फ़ंक्शन ने केवल पूर्णांक का उपयोग किया, लेकिन यह अन्य 'सामान्य' मापदंडों के साथ उसी तरह से काम करता है, क्योंकि वे हमेशा पूर्णांक में आते हैं। लक्ष्य फ़ंक्शन को उनके प्रकार पता चल जाएंगे, लेकिन आपके मध्यस्थ के आवरण की आवश्यकता नहीं है। रैपर को भी तर्क की सही संख्या जानने की जरूरत नहीं है क्योंकि लक्ष्य फ़ंक्शन को भी पता चल जाएगा। उपयोगी काम करने के लिए (केवल कॉल लॉग करने के अलावा), आपको शायद दोनों को जानना होगा।