天天看點

c語言不定長參數處理,C語言中不定參數的實作

該樓層疑似違規已被系統折疊 隐藏此樓檢視此樓

但是請注意,由於 K&R C 中并不檢查參數型态,so 在此是用 ANSI

C 來說明,畢竟 ANSI C 是目前所有 C Compiler 都支援的标準;常在

網路上看到有人推薦 K&R The C Programming Language 這本書,老

實說這本是不錯(我以前也是看這本),但因為 K&R C 慢慢因為 ANSI

C 的完整标準出現,而面臨考驗,是以我建議若是初學者先從 ANSI C

看起,等對 ANSI C 的标準了解後,再回頭看這本(其實不看也沒差,雖

然它号稱 C 語言聖經,但時代在變,有些東東開始不适用。不過還是有

看的價值)

//

// 固定的參數一定要放前面!!

int FUNC(int xx,...)

{

int tmp;

va_list arg_ptr; // 用va_list聲明指向引數清單的 Pointer

va_start(arg_ptr,xx); // 從引數表中取得第一個引數

// 第一個引數就是 xx 自己(xx是最後一個固定變量)

tmp=va_arg(arg_ptr,int); // 從引數表中取得int 型态引數

// 一直呼叫 va_arg 即可取得所

// 有引數(第二個參數int是目前不定變量的類型 )

va_end(arg_ptr); // 取完後将 arg_ptr = NULL

// 以便歸還 stack 空間(要在所有的不定變量引用完之後再用va_end(),否則會有無法預測的結果。)

}

理論上不定參數是可以無限多的,但礙於 memory 及 stack 大小

是以項數通常有上限,如 Turbo C 最多 200 個,一超過就出現如下

" Fatal stack overflow error-System halted ",然後當掉,你連

暖開機都不行;是以當你使用一套 Compiler 時一定要有其參考手冊

或資料,以免搞半天除錯後,還找不出原因!!

(P.S. 像 Turbo C 2.0 隻能用 4000 個 if ,....太多要注意的!!)

說了一堆,不知道你會用了沒?! 最後用一個畫多邊型的函數做□

例,順便做結束。

#include  // 記得要 include 才能用

#define END_P -400 // 用來判斷是否為最後一個參數

void DrawPoly(int color,...)

{

va_list arg_ptr;

int x[200],y[200]; // 最多 200 個點

int p_c=0; // 計算有幾點

int i; // 計數器

va_list(arg_ptr,color);

while(((x[p_c]=va_arg(arg_ptr,int))>END_P) \

&&((y[p_c]=va_arg(arg_ptr,int))>END_P)\

&& p_c<=200) // 不是最後一點且小於 200 個點

p_c++;

if(p_c<3) return ; // 不到 3 點不成一多邊型,So 跳出

for(i=0;i

// 劃線,每個 Compiler 不同,自行修改

line(x[i],y[i],x[i+1],y[i+1],color);

// 最後一條線

line(x[0],y[0],x[p_c-1],y[p_c-1],color);

va_end(arg_ptr);

}