c語言中va_*用法

想想我們常使用的c函數printf();

printf("sum of %d, %d, %d, %d: %d\n", 1, 3, 5, 7, sum(1, 3, 5, 7));

of course, the result is: sum of 1, 3, 5, 7: 16;

爲什麼printf()可以使用個數不定的變量?這是因爲它內部使用了va_*系列函數(準確地說是宏)。

我們看看printf()的定義:

printf(const char *fmt, ...);
我們看到printf()函數的參數列表主要包含兩個重要的元素:

1.const char *fmt,這是唯一一個已知的變量。

2. ...,代表2nd,3rd,...等未知變量。

注:未知變量必須位於變量列表的末位。


那麼如何表達這些未知變量呢?

va_list類型(注意,這是一個類型)包含了此類變量列表的信息。So, 如果我們想要獲取未知變量的信息,我們這必須定義一個變量:

va_list ap;


Then, 我們使用va_start初始化ap,並使ap指向第一個未知變量。va_start原型:

void va_start(va_list ap, paraN);
Initializes ap to retrieve the additional arguments after parameter
//初始化ap,並使ap接收paraN之後的變量。也就量說paraN是最後一個已知變量
// va_start與va_end是一對宏,調用了va_start以示開始,就必須調用va_end以示結束。


下一步,我們開始使用va_arg從未知變量裏面取數。在取數之前,你必須知道你傳入此函數的變量的具體類型。我們以此爲例點擊打開鏈接

<pre name="code" class="cpp">void PrintFloats (int n, ...)
{
  int i;
  double val;
  printf ("Printing floats:");
// 定義一個接收variable arguments的變量。</span>
  va_list vl;
// 初始化vl,以使vl指向n後的第一個variable argument.</span>
  va_start(vl,n);
  for (i=0;i<n;i++)
  {
// 從vl中提取variable arguments。</span>
// 必須知道數據類型,如此例中的double。</span>
// 每次va_arg的調用都會改變vl的狀態。這樣下一次的調用就會返回下一個variable argument。</span>
    val=va_arg(vl,double);
    printf (" [%.2f]",val);
  }
// 取數完成.調用va_end()釋放vl。</span>
  va_end(vl);
  printf ("\n");
}






發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章