C語言中變長引數例項

2021-06-27 16:13:58 字數 998 閱讀 9094

#include #include #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, ...)

int main(int argc, char* argv)

C語言中變長引數的函式的實現

當我們定義乙個函式時,有可能無法確定引數的個數,這是就需要用到變長引數函式,就想標準c函式printf一樣。一般這樣宣告 void func char form,前面至少有乙個確定的引數。函式體內如何獲取這些引數呢?這就需要用到幾個巨集以及了解他們的原理。函式引數是以資料結構 棧的形式訪問 從右至左...

C語言變長引數處理

va list 是c語言中解決變長引數問題的一組巨集 va list的用法 1 首先在函式裡定義乙個va list型別的變數,這個變數是指向引數的指標 2 然後用va start巨集初始化剛定義的va list變數,這個巨集的第二個引數是第乙個可變引數的前乙個引數,是乙個固定的引數 3 然後用va ...

C語言變長引數實現

include include include 編寫可變長引數列表的函式案例 void minprintf char fmt,這個函式只處理格式字串和引數,格式的轉換則通過printf函式實現 省略號表示引數的數量和型別是可變的,省略號只能出現再參數列的尾部,minprintf不需要像printf ...