Ya, Anda bisa melakukannya, tetapi itu agak jelek dan Anda harus tahu jumlah maksimal argumen. Lebih jauh lagi jika Anda menggunakan arsitektur di mana argumen tidak diteruskan pada stack seperti x86 (misalnya, PowerPC), Anda harus tahu apakah tipe "spesial" (double, float, altivec, dll.) Digunakan dan jika jadi, hadapi mereka sesuai. Ini bisa terasa menyakitkan dengan cepat tetapi jika Anda menggunakan x86 atau jika fungsi asli memiliki batas yang didefinisikan dengan baik dan terbatas, itu bisa bekerja.
Itu masih akan menjadi hack , gunakan untuk tujuan debugging. Jangan membangun perangkat lunak Anda di sekitar itu. Bagaimanapun, berikut ini contoh yang berfungsi pada 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;
}
Untuk beberapa alasan, Anda tidak dapat menggunakan float dengan va_arg, gcc mengatakan mereka dikonversi menjadi dua kali lipat tetapi program macet. Itu saja menunjukkan bahwa solusi ini adalah peretasan dan tidak ada solusi umum. Dalam contoh saya, saya berasumsi bahwa jumlah maksimum argumen adalah 8, tetapi Anda dapat meningkatkan jumlah itu. Fungsi yang dibungkus juga hanya menggunakan bilangan bulat tetapi berfungsi dengan cara yang sama dengan parameter 'normal' lainnya karena selalu dilemparkan ke bilangan bulat. Fungsi target akan tahu tipenya tetapi pembungkus perantara Anda tidak perlu. Wrapper juga tidak perlu tahu jumlah argumen yang tepat karena fungsi target juga akan mengetahuinya. Untuk melakukan pekerjaan yang bermanfaat (kecuali hanya mencatat panggilan), Anda mungkin harus mengetahui keduanya.