C語言中變長參數實例

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

#define SUM(arg...) sum("My name is", ##arg)

char *sum(char *a, ...);

/*******************/
/* 
 * 變長參數的實現基於的是 
 * C 語言默認的 cdecl 調用慣例中
 * 自右向左壓棧的傳遞方式
 * 比如 sum(a, b, c) 的各個參數在
 * 棧中的相對順序爲
    ----------------------
    |    Top of Stack    |
    ----------------------
    |       ...          |
    ----------------------
    |        c           |
    ----------------------
    |        b           |
    ----------------------
    |        a           |
    ----------------------
    |       ...          |
    ----------------------

其中變長參數用到的幾個宏的定義如下:

#define va_list char*
#define va_start(ap, arg) (ap=(va_list)&arg+sizeof(arg))
#define va_arg(ap,t) (*(t*)((ap+=sizeof(t))-sizeof(t)))
#define va_end (va=(va_list)0)

*/
/*******************/

char *sum(char *a, ...)
{
    // 定義類型爲 va_list 的變量
    va_list ap;

    // 初始化 va_list
    va_start(ap, a);

    char *b = va_arg(ap, char *);
    char *c = va_arg(ap, char *);

    va_end(ap);

    return c;
}

int main(int argc, char* argv[])
{
    printf("%s\n", SUM(argv[1], argv[2]));
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章