可變參數函數


https://blog.csdn.net/zhangxiangdavaid/article/details/38278249

https://www.cnblogs.com/engraver-lxw/p/7225232.html

int demo(char* msg,...)
{
    if (!msg)
    {
        return 0;
    }

    int count = 0;

    va_list p;
    va_start(p, msg);

    while (true)
    {
        count++;
        char* s = va_arg(p, char*);

        if (strcmp(s, "") == 0)
        {
            printf("\n");
            break;
        }

        printf("%s", s);
    }

    va_end(p);

    return count;
}

//測試
int count = demo("demo", "This", "is", "a", "demo!", "");

可變參數函數的一般形式如下:
返回值類型 函數名(類型1 參數1,類型2 參數2,...類型n 參數n,...);

如上所示,這是一個典型的可變參數樣式,它共有n個確定的參數,最后的...表示可變參數的含義。必須指出...必須位於最后,並且它至少要有一個確定的參數。

為了開發可變參數的函數,需用到頭文件stdarg.h。
下面是 <stdarg.h> 里面重要的幾個宏定義如下:
typedef char* va_list;
void va_start ( va_list ap, prev_param ); /* ANSI version */
type va_arg ( va_list ap, type );
void va_end ( va_list ap );


  va_list 是一個字符指針,可以理解為指向當前參數的一個指針,取參必須通過這個指針進行。
  <Step 1> 在調用參數表之前,定義一個 va_list 類型的變量,(假設va_list 類型變量被定義為ap);
  <Step 2> 然后應該對ap 進行初始化,讓它指向可變參數表里面的第一個參數,這是通過 va_start 來實現的,第一個參數是 ap 本身,第二個參數是在變參表前面緊挨着的一個變量,即“...”之前的那個參數;
  <Step 3> 然后是獲取參數,調用va_arg,它的第一個參數是ap,第二個參數是要獲取的參數的指定類型,然后返回這個指定類型的值,並且把 ap 的位置指向變參表的下一個變量位置;
  <Step 4> 獲取所有的參數之后,我們有必要將這個 ap 指針關掉,以免發生危險,方法是調用 va_end,他是輸入的參數 ap 置為 NULL,應該養成獲取完參數表之后關閉指針的習慣。說白了,就是讓我們的程序具有健壯性。通常va_start和va_end是成對出現

va_start()的作用是使va_list型的變量指向第一個可變參數,故需要使用到離...最近的一個固定的確定的參數,
這就是在設計可變參數函數時至少需要一個確定參數的原因。

接着使用va_arg(p, char*),不斷解析pData指向內存區域,且要指明用何種方式解析,這是va_arg()第二個參數的作用,
解析完后,pData指向下一個可變參數的地址。由此即可得到所有的可變參數的值。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM