有意思的stdarg.h標頭檔

來源:互聯網
上載者:User

       stdarg.h是C語言中C標準函數庫的標頭檔,stdarg是由standard(標準) arguments(參數)簡化而來,主要目的為讓函數能夠接收可變參數。C++的cstdarg標頭檔中也提供這樣的功能;雖然與C的標頭檔是相容的,但是也有衝突存在。

       可變參數函數的參數數量是可變動的,它使用省略符號來忽略之後的參數。例如c語言中的printf函數一般。代表性的聲明為:int
check(int a, double b, ...); 可變參數函數最少要有一個命名的參數,所以char *wrong(...);在C中是不被允許的(在C++中,這樣的聲明是合理的)。C中,省略符號之前必須要有逗號;而在C++中,則沒有這種強制要求。

      stdarg.h的資料類型:va_list  用來儲存宏va_arg與宏va_end所需資訊。

   
  stdarg.h宏:va_start  使va_list指向起始的參數

                             va_arg
   檢索參數

 
                           va_end  
釋放va_list

 
                           va_copy   拷貝va_list的內容 

 
     訪問未命名的參數,首先必須在可變參數函數中聲明va_list類型的變數。調用va_start並傳入兩個參數:第一個參數為va_list類型的變數,第二個為省略符號前最後一個有名字的參數的名稱,接著每一調用va_arg就會返回下一個參數,va_arg的第一個參數為va_list,第二個參數為返回的類型。最後va_end必須在函數返回前被va_list調用(va_list當作參數)(沒有要求要讀取完所有參數)。C99提供額外的宏,va_copy,它能夠複製va_list。而va_copy(va2,
va1)函數作用為拷貝va1到va2。沒有機制定義該怎麼判別傳遞到函數的參數量或者資料類型。函數通常需要知道或確定它們變化的方法。共通的慣例包含:使用printf或scanf類的格式化字串來嵌入明確指定的類型。在可變參數最後的標記值(sentinel
value)。總數變數來指明可變參數的數量。

   例子:

       #include <stdio.h>

  #include <stdarg.h>

  void printargs(int arg1, ...)      //輸出所有int類型的參數,直到-1結束 

{

   va_list ap;

  
int i;

  
va_start(ap, arg1);

  
for (i = arg1; i != -1; i = va_arg(ap, int))

  
printf("%d ", i);

  
va_end(ap);

  
putchar('\n');

  }

  int main(void)

  {

  
printargs(5, 2, 14, 84, 97, 15, 24, 48, -1);

  
printargs(84, 51, -1);

  
printargs(-1);

  
printargs(1, -1);

  
return 0;

  }

  這個程式產生輸出:

  5 2 14 84 97 15 24 48

  84 51

  1

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.