#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]));
}
C語言中變長參數實例
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.