হ্যাঁ আপনি এটি করতে পারেন, তবে এটি কিছুটা কুরুচিপূর্ণ এবং আপনাকে আর্গুমেন্টের সর্বাধিক সংখ্যা জানতে হবে। এছাড়াও আপনি যদি এমন কোনও আর্কিটেকচারে থাকেন যেখানে x86 (উদাহরণস্বরূপ, পাওয়ারপিসি) এর মতো স্ট্যাকের উপর আর্গুমেন্টগুলি পাস করা হয় না, আপনাকে "বিশেষ" প্রকারগুলি (ডাবল, ফ্লোটস, অ্যালটিভেক ইত্যাদি) ব্যবহার করা হয় কিনা তা জানতে হবে এবং যদি সুতরাং, তাদের সাথে সেই অনুযায়ী আচরণ করুন। এটি দ্রুত বেদনাদায়ক হতে পারে তবে আপনি যদি 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 সহ ফ্লোট ব্যবহার করতে পারবেন না, জিসিসি বলেছেন যে এগুলি দ্বিগুণ রূপান্তরিত হয়েছে তবে প্রোগ্রামটি ক্র্যাশ হয়ে গেছে। এটি একাই প্রমাণ করে যে এই সমাধানটি হ্যাক এবং এর কোনও সাধারণ সমাধান নেই। আমার উদাহরণে আমি ধরে নিয়েছি যে আর্গুমেন্টের সর্বাধিক সংখ্যা ছিল 8, তবে আপনি এই সংখ্যাটি বাড়াতে পারেন। মোড়ানো ফাংশনটি কেবলমাত্র পূর্ণসংখ্যার ব্যবহার করে তবে এটি অন্যান্য 'স্বাভাবিক' পরামিতিগুলির সাথে একইভাবে কাজ করে যেহেতু তারা সবসময় পূর্ণসংখ্যায় ফেলে দেয়। লক্ষ্য ফাংশনটি তাদের প্রকারগুলি জানতে পারবে তবে আপনার মধ্যস্থতার মোড়কের দরকার নেই doesn't মোড়কের ক্ষেত্রে সঠিক ক্রিয়াকলাপটি এটিও জেনে নিবে কারণ যুক্তিগুলির সঠিক সংখ্যাটিও জানতে হবে না। দরকারী কাজ করতে (কেবলমাত্র কলটি লগ করা ব্যতীত), সম্ভবত আপনাকে উভয়ই জানতে হবে।