va_end

由於在C語言中沒有函式重載,解決不定數目函式參數問題變得比較麻煩;即使採用C++,如果參數個數不能確定,也很難採用函式重載.對這種情況,有些人採用指針參數來解決問題。下面就c語言中處理不定參數數目的問題進行討論。

基本介紹

  • 外文名:va_end
  • 屬於:C語言
  • 宏原型:type va_arg
  • 類別:可變數目變元
簡介,宏原型,創建,定義,分布位置,示例代碼,

簡介

“C語言”可變數目變元
宏va_arg()、va_start()和va_end()一起使用,便可以完成向函式傳入數目可變的變元操作。取可變數目變元的典型例子是函式printf()。類型va_list是在<stdarg.h>中定義的。

宏原型

上述的宏原型如下所示:
type va_arg(va_list argptr, type);
void va_end(va_list argptr);
void va_start(va_list argptr, last_parm);
它們都包含在頭檔案<stdarg.h>中。

創建

創建一個能獲取可變數目變元的函式的通用過程:在函式定義中,可變參數表之前必須有一個或多個已知參數,其中最右者為last_parm。在調用va_start()時,last_parm名被用作第二個參數。
任何可變長度的變元被訪問之前,必須先用va_start()初始化變元指針argptr。初始化argptr後,經過對va_arg()的調用,以作為下一個參數類型的參數類型,返回參數。最後取完所有參數並從函式返回之前。必須調用va_end()。由此確保堆疊的正確恢復。
如果未正確使用va_end(),程式可能癱瘓。
例子:
用sum_series()求一系列的總和,sum_series()的第一個變元是數列項目數。本程式是求以下數列的前四項之和:
1/2+1/(2*2)+1/(2*2*2)...............
#include <stdio.h>#include <stdarg.h>double sum_series(int num, ...);int main(){  double d;  d= sum_series(4, 0.5, 0.25, 0.125, 0.06254);  printf("Sum of series is %f.\n", d);  return 0;}double sum_series(int num, ...){  double sum= 0.0, t;  va_list argptr;  va_start(argptr, num);  for(; num; num--)  {    t= va_arg(argptr, double);    sum= sum+ t;  }  va_end(argptr);  return sum;}

定義

大家先看幾宏.
在VC++6.0的include有一個stdarg.h頭檔案,有如下幾個宏定義:
#define _INTSIZEOF(n) ((sizeof(n)+sizeof(int)-1)&~(sizeof(int) - 1) )

相關詞條

熱門詞條

聯絡我們