C基礎(chǔ)(C語言中可變參數(shù)用法)

字號(hào):

在C語言中比較常用的可變參數(shù)就是printf();函數(shù)原型如下:
    int printf(const char * format,...);
    寫一個(gè)簡(jiǎn)單的可變參數(shù):
    #include
    void va_fun(int i,...);
    int main(void)
    {
    va_fun(100);
    va_fun(200,100);
    va_fun(100,200,300);
    }
    void va_fun(int i,...)
    {
    va_list arg_ptr;
    int j = 0;
    va_start(arg_ptr,i);
    j = va_arg(arg_ptr,int);
    va_end(arg_ptr);
    printf("%d %d\n",i,j);
    }
    這樣就實(shí)現(xiàn)了一個(gè)簡(jiǎn)單的可變參數(shù)。其實(shí)可變參數(shù)是利用宏來實(shí)現(xiàn)的,宏在參數(shù)的堆棧中查找參數(shù)的位置,然后返回。
    定義如下:
    typedef char * va_list;
    #define _INTSIZEOF(n) ((sizeof(n)+sizeof(int)-1)&~(sizeof(int) - 1) )
    #define va_start(ap,v) ( ap = (va_list)&v + _INTSIZEOF(v) )
    #define va_arg(ap,t) ( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) )
    #define va_end(ap) ( ap = (va_list)0 )
    其實(shí)就是計(jì)算參數(shù)堆棧中的內(nèi)存地址。
    建議少用可變參數(shù),在c++中用多態(tài)實(shí)現(xiàn)就可以。
    printf中根據(jù)format中的參數(shù)的個(gè)數(shù)確定后面參數(shù)的個(gè)數(shù)。