2020年4月17日 星期五

C: variable argument lists

函數可有未知數目和 type 的引數。

#include <stdarg.h>

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

首先宣告一個 va_list 物件,然後使用 va_start() 初始化物件,和 va_end() 成對使用,之間用 va_arg()、或 vprintf() 等使用 va_list 物件。
va_arg() 將第一個引數定義為 type 後指到下個引數。

#include <stdarg.h>

void my_printf(const char *fmt, ...)
{
    va_list ap;        //宣告一個 va_list 物件 ap
 
    va_start(ap, fmt); //初始化 ap
    vprintf(fmt, ap);  //使用 ap 並更新指到下個未用的引數
    va_end(ap);        //結束 ap
}

va_list 最普遍是一個指標指到函數的 stack frame,複製可以直接指定:

va_list aq = ap

但也有系統是一個陣列,內容是一個指標,需要:

va_list aq;
*aq = *ap;

另外,argument 如果是透過暫存器傳遞的系統,va_start() 需要配置記憶體存 arguments 和指示哪個是下個 argument,va_end() 可以釋出配置的記憶體。

因應不同情況, C99 新增 va_copy(),複製變成:

va_list aq;
va_copy(aq, ap);
...
va_end(aq);

沒有留言:

張貼留言

SIP header Via

所有 SIP 訊息 都要有 Via,縮寫 v。一開始的 UAC 和後續途經的每個 proxy 都會疊加一個 Via 放傳送的位址,依序作為回應的路徑。 格式 sent-protocol sent-by [ ;branch= branch ][ ; 參數 ...] s...