該樓層疑似違規已被系統折疊 隐藏此樓檢視此樓
但是請注意,由於 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);
}