1. 程式人生 > >C語言不定引數的兩種實現

C語言不定引數的兩種實現

1、使用以下三個函式可實現不定引數

#include<stdarg.h>

void va_start(va_list ap, last);
type va_arg(va_list, type);
void va_end(va_list ap);

《1》、va_start
該函式用來初始化指標變數ap(va_list實際是void型別),之後處理引數就預設從ap開始處理。last一般為傳過來的引數列表的第一個引數。
《2》、va_arg
該函式就是將ap指標按照type型別向後移動,然後返回ap所指的那個引數。
注意:
type型別不能是float,其它不支援暫不知(測試過char

,int, short均可以)
《3》、va_end
和va_start配套使用,做善後。

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

//count 人為將引數個數傳遞進去
int test(int count, short first, ...)
{
    va_list argp;
    int sum = 0;
    int tmp = 0;
    va_start(argp, first);
    printf("%d \t", first);
    for (int i = 1; i < count; ++i)
    {
        printf("%d \t", va_arg(argp,short));
    }
    
    va_end(argp);
    return 0;
}

int main()
{
    test(10, 5, 6, 8, 9, 10, 56, 89, 52, 21, 110);
    getchar();
    return 0;
}

2、可變引數巨集 …和__VA_ARGS__
C99規範中新增的巨集

#define debug(format, ...)    fprintf(stdout, format, __VA_ARGS__)
int test(int count, short first, ...)
{
    va_list argp;
    int sum = 0;
    int tmp = 0;
    va_start(argp, first);
    printf("%d \t", first);
    for (int i = 1; i < count; ++i)
    {
        debug("%d \t", va_arg(argp,short));
     //printf("%d \t", va_arg(argp,short));
    }
    
    va_end(argp);
    return 0;
}

3、參考
《1》、https://www.cnblogs.com/linhaostudy/p/6695422.html;
《2》、https://www.cnblogs.com/alexshi/archive/2012/03/09/2388453.html
8、