因此對可變參數的函式作了小小的研究,並寫成function以便日後使用
================== 正題開始 =================
在C/C++中,有所謂的variant argument(變動引數)。也就是可以讓函數
使用數量不固定的引數。printf()就是這類的函數。
定義一個函數的prototype(原型)時,若是將參數列以"..."代入,就表示這個函數即將
使用variant argument。如:
danny_func(char *result, ...)
這樣子便可讓編繹器不檢驗傳入這種函數裡的引數型態和數量,編出來的程式碼在呼叫端
就能夠盡可能地把各式各樣引數傳入。
那麼,在如此的程式裡,要怎麼存取variant argument呢?因為缺少引數變數,所以我們
不可能像一般程式一樣直接存取它們,而是要改用stdarg.h裡面所提供的三個巨集與一個
型別,分別是:
va_list: 宣告一個指標,讓它指向引數串列。
va_start: 初始化這個指標,讓它真正指向正確的引數串列開頭。
va_arg: 來取得va_list中的資料。
va_end: 清除這個指標,把它設為NULL。範例如下:
因此打算實作一個 danny_strcat(char *result, ...) 這樣子的function。
首先還是必須先使用到上面介紹的 linux當中的這些函式。
實作範例如下:
================= danny_strcat.c ====================
#include <stdio.h>
#include <string.h>
#include <stdarg.h>
void danny_strcat(char *result, ...)
{
va_list ap;
char *p;
va_start(ap, result);
p = va_arg(ap, char *);
while (p != NULL) {
strcat(result, p);
p = va_arg(ap, char*);
}
va_end(ap);
}
int main(void)
{
char tmp[512]={0};
char tmp2[32]="strcat";
danny_strcat(tmp, "hello-", "world-", "danny-", tmp2, NULL);
printf("In main tmp=%s\n",tmp);
return 0;
}
輸出結果:
*目前的作法- 當呼叫這個可變參數的函式時,使用者必須在參數的最後面加上NULL,來告知它結束的點。
沒有留言:
張貼留言