• <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>
  • 關于可變參數的函數定義方法(轉貼)

    發表于:2007-05-25來源:作者:點擊數: 標簽:方法可變定義參數關于
    那天無意中發現這個帖子,感覺寫的不錯,那到這里來,給大家共享一下! 某些情況下希望函數的參數個數可以根據需要確定。典型的例子有大家熟悉的函數printf()、scanf()和系統調用execl()等。那么它們是怎樣實現的呢?C編譯器通常提供了一系列處理這種情況的

    那天無意中發現這個帖子,感覺寫的不錯,那到這里來,給大家共享一下! 

    某些情況下希望函數的參數個數可以根據需要確定。典型的例子有大家熟悉的函數printf()、scanf()和系統調用execl()等。那么它們是怎樣實現的呢?C編譯器通常提供了一系列處理這種情況的宏,以屏蔽不同的硬件平臺造成的差異,增加程序的可移植性。這些宏包括va_start、va_arg和va_end等。 


    ---- 采用ANSI標準形式時,參數個數可變的函數的原型聲明是: 

    type funcname(type para1, type para2, ...) 
    ---- 這種形式至少需要一個普通的形式參數,后面的省略號不表示省略,而是函數原型的一部分。type是函數返回值和形式參數的類型。 
    ---- 采用與UNIX System V兼容的聲明方式時,參數個數可變的函數原型是: 

    type funcname(va_alist) 
    va_dcl 

    ---- 這種形式不需要提供任何普通的形式參數。type是函數返回值的類型。va_dcl是對函數原型聲明中參數va_alist的詳細聲明,實際是一個宏定義,對不同的硬件平臺采用不同的類型來定義,但在最后都包括了一個分號。因此va_dcl后不再需要加上分號了。va_dcl在代碼中必須原樣給出。va_alist在VC中可以原樣給出,也可以略去。 
    ---- 此外,采用頭文件stdarg.h編寫的程序是符合ANSI標準的,可以在各種操作系統和硬件上運行;而采用頭文件varargs.h的方式僅僅是為了與以前的程序兼容。所以建議大家使用前者。以下主要就前一種方式對參數的處理做出說明。兩種方式的基本原理是一致的,只是在語法形式上有一些細微的區別。 

    ---- va_start使argp指向第一個可選參數。va_arg返回參數列表中的當前參數并使argp指向參數列表中的下一個參數。va_end把argp指針清為NULL。函數體內可以多次遍歷這些參數,但是都必須以va_start開始,并以va_end結尾。 

    ---- 調用者在實際調用參數個數可變的函數時,要通過一定的方法指明實際參數的個數,例如把最后一個參數置為空字符串(系統調用execl()就是這樣的)、-1或其他的方式(函數printf()就是通過第一個參數,即輸出格式的定義來確定實際參數的個數的)。 

    ---- 下面給出一個具體的例子。是采用了符合ANSI標準的形式的代碼。代碼中加了一些注釋,這里就不再解釋了。該例子已經在VC/Windows XP、CC/AIX4.3.2.0、GCC/SUSE7.3環境下編譯并正常運行。 

    ---- 1、演示如何使用參數個數可變的函數,采用ANSI標準形式 

    #include < stdio.h > 
    #include < string.h > 
    #include < stdarg.h > 

    /* 函數原型聲明,至少需要一個確定的參數, 
    注意括號內的省略號 */ 
    int demo( char *, ... ); 

    void main( void ) 

    demo("DEMO", "This", "is", "a", "demo!", "\0"); 


    /* ANSI標準形式的聲明方式,括號內的省略號表示可選參數 */ 
    int demo( char *msg, ... ) 

    va_list argp; /* 定義保存函數參數的結構 */ 
    int argno = 0; /* 紀錄參數個數 */ 
    char *para; /* 存放取出的字符串參數 */ 

    /* argp指向傳入的第一個可選參數, 
    msg是最后一個確定的參數 */ 
    va_start( argp, msg ); 

    while (1) { 
    para = va_arg( argp, char *); /* 
    取出當前的參數,類型為char *. */ 
    if ( strcmp( para, "\0") == 0 ) 
    /* 采用空串指示參數輸入結束 */ 
    break; 
    printf("Parameter #%d is: %s\n", argno, para); 
    argno++; 

    va_end( argp ); /* 將argp置為NULL */ 
    return 0; 
    }

     parady 回復于:2004-04-10 18:53:09
    今天下午看書時正好看到這部分內容,本想找個例子看看,真是正中下懷!頂一下!

     aero 回復于:2004-04-10 19:08:03
    不錯。

     Lippman 回復于:2004-04-21 22:20:38
    嗯,這個在The C programming language里面有描述,可以看看那里

    原文轉自:http://www.kjueaiud.com

    評論列表(網友評論僅供網友表達個人看法,并不表明本站同意其觀點或證實其描述)
    老湿亚洲永久精品ww47香蕉图片_日韩欧美中文字幕北美法律_国产AV永久无码天堂影院_久久婷婷综合色丁香五月

  • <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>