計算機二級考試C語言輔導:C語言中不定參數的實現

字號:

相信大家都用過 printf 這個函數,這就是利用不定參數,來達到參數項目不固定的目的。但是請注意,由於K&R C中并不檢查參數型態(tài),so 在此是用ANSIC來說明,畢竟ANSI C是目前所有C Compiler都支援的標準;常在網路上看到有人推薦K&R The C Programming Language這本書,老實說這本是不錯(我以前也是看這本),但因為K&R C慢慢因為 ANSIC 的完整標準出現,而面臨考驗,所以我建議若是初學者先從ANSI C看起,等對ANSI C的標準了解後,再回頭看這本(其實不看也沒差,雖然它號稱C %D但是請注意,由於K&R C中并不檢查參數型態(tài),so在此是用ANSIC來說明,畢竟ANSI C是目前所有C Compiler都支援的標準;常在網路上看到有人推薦K&R The C Programming Language這本書,老實說這本是不錯(我以前也是看這本),但因為K&R C慢慢因為 ANSIC 的完整標準出現,而面臨考驗,所以我建議若是初學者先從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 型態(tài)引數
    // 一直呼叫 va_arg 即可取得所
    // 有引數(第二個參數int是當前不定變量的類型 )
    va_end(arg_ptr); // 取完後將 arg_ptr = NULL
    // 以便歸還 stack 空間(要在所有的不定變量引用完之后再用va_end(),否則會有無法預測的結果。)
    }