آموزش نوشتن تابع با آرگومان‌های متغیر در زبان C

شاید برایتان سوال پیش آمده باشد که چطور تابعی مانند printf بنویسیم که تعداد آرگومان‌هایش متغیر باشد. برای اینکار باید از هدرفایل stdarg.h استفاده کنیم. هنگام تعریف تابع باید پارامترهای متغیر را بصورت … (سه‌نقطه) تعریف کنیم. بعد از include کردن هدرفایل stdarg.h، باید یک داده از نوع va_list تعریف کنیم که اطلاعات آرگومان‌ها را در خود نگهداری کند. قبل از دسترسی به لیست آرگومان‌ها باید ماکروی va_start صدا زده شود که دو ورودی می‌گیرد. ورودی اول داده‌ای از نوع va_list می‌باشد که بیانگر لیست آرگومان‌ها است و ورودی دوم هم تعداد آرگومان‌ها است. تعداد آرگومان‌ها را هم می‌توان هنگام صدا کردن تابع ارسال کرد (البته روش‌های دیگری هم وجود دارد که شاید بعدها به آن اشاره کردیم). سپس با استفاده از ماکروی va_arg، می‌توان یکی یکی به آرگومان‌ها دسترسی پیدا کرد. ماکروی va_arg هم دو ورودی می‌گیرد. ورودی اول لیست آرگومان‌های تابع است و ورودی دوم هم نوع دادهٔ آرگومانِ فعلی است. قبل از بازگشت تابع هم باید ماکروی va_end صدا زده شود.

#include <stdio.h>
#include <stdarg.h>

void print_numbers(int, ...);

int main()
{
    int count = 6;

    print_numbers(count, 7, 3, 9, 11, 4, 28);

    return 0;
}

void print_numbers(int arg_count, ...)
{
    int n;
    va_list ap;

    va_start(ap, arg_count);

    n = va_arg(ap, int);
    printf("%d\n", n);

    n = va_arg(ap, int);
    printf("%d\n", n);

    n = va_arg(ap, int);
    printf("%d\n", n);

    n = va_arg(ap, int);
    printf("%d\n", n);

    n = va_arg(ap, int);
    printf("%d\n", n);

    n = va_arg(ap, int);
    printf("%d\n", n);

    va_end(ap);
}

Output:

7
3
9
11
4
28

فایل ضمیمهٔ زیر شامل ۴ مثال دربارهٔ این موضوع است که به درک بهتر این موضوع کمک می‌کند.

MD5 checksum:
33c5591bcd5651f29f38a28c0f69e3c2 *variable_arguments.zip