• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            woaidongmao

            文章均收錄自他人博客,但不喜標(biāo)題前加-[轉(zhuǎn)貼],因其丑陋,見諒!~
            隨筆 - 1469, 文章 - 0, 評(píng)論 - 661, 引用 - 0
            數(shù)據(jù)加載中……

            可變參數(shù)傳遞方法

                   有時(shí)候,我們寫函數(shù)的時(shí)候,可能遇到參數(shù)數(shù)量不確定的情況,這樣的函數(shù)例如Cprintf打印函數(shù)。你可以使用printf("some string"), 也可以使用printf("%d", aintvalue)。是不是C的庫(kù)里包含了不同定義的printf函數(shù)呢?答案肯定是否定的,因?yàn)?span lang="EN-US">C是不支持函數(shù)的重載的。每個(gè)函數(shù)只能由一個(gè)版本。那么是如何實(shí)現(xiàn)類似這種可變參數(shù)傳遞的函數(shù)呢?在這講三種方法。

            1)方法1:使用va_list
                     
            涉及到如下變量和函數(shù)(摘自msdn):
            type va_arg( va_list arg_ptr, type );
            void va_end( va_list arg_ptr );
            void va_start( va_list arg_ptr );   (UNIX version)
            void va_start( va_list arg_ptr, prev_param );   (ANSI version)
                    
            參數(shù)含義:
            type
            :參數(shù)類型
            arg_ptr
            :指向參數(shù)列表的指針
            prev_param
            :第一個(gè)參數(shù)的類型

                     下面采用msdn里的一個(gè)例子。

            1.        /* VA.C: The program below illustrates passing a variable

            2.        * number of arguments using the following macros:

            3.        *      va_start            va_arg              va_end

            4.        *      va_list             va_dcl (UNIX only)

            5.        */

            6.         

            7.        #include <stdio.h>

            8.        #define ANSI            /* Comment out for UNIX version     */

            9.        #ifdef ANSI             /* ANSI compatible version          */

            10.    #include <stdarg.h>

            11.    int average( int first, ... );

            12.    #else                   /* UNIX compatible version          */

            13.    #include <varargs.h>

            14.    int average( va_list );

            15.    #endif

            16.     

            17.    void main( void )

            18.    {

            19.       /* Call with 3 integers (-1 is used as terminator). */

            20.       printf( "Average is: %d\n", average( 2, 3, 4, -1 ) );

            21.     

            22.       /* Call with 4 integers. */

            23.       printf( "Average is: %d\n", average( 5, 7, 9, 11, -1 ) );

            24.     

            25.       /* Call with just -1 terminator. */

            26.       printf( "Average is: %d\n", average( -1 ) );

            27.    }

            28.     

            29.    /* Returns the average of a variable list of integers. */

            30.    #ifdef ANSI             /* ANSI compatible version    */

            31.    int average( int first, ... )

            32.    {

            33.       int count = 0, sum = 0, i = first;

            34.       va_list marker;

            35.     

            36.       va_start( marker, first );     /* Initialize variable arguments. */

            37.       while( i != -1 )

            38.       {

            39.          sum += i;

            40.          count++;

            41.          i = va_arg( marker, int);

            42.       }

            43.       va_end( marker );              /* Reset variable arguments.      */

            44.       return( sum ? (sum / count) : 0 );

            45.    }

            46.    #else       /* UNIX compatible version must use old-style definition.  */

            47.    int average( va_alist )

            48.    va_dcl

            49.    {

            50.       int i, count, sum;

            51.       va_list marker;

            52.     

            53.       va_start( marker );            /* Initialize variable arguments. */

            54.       for( sum = count = 0; (i = va_arg( marker, int)) != -1; count++ )

            55.          sum += i;

            56.       va_end( marker );              /* Reset variable arguments.      */

            57.       return( sum ? (sum / count) : 0 );

            58.    }

            59.    #endif

                      通過(guò)上面的例子可以清楚知道怎么傳遞可變參數(shù)了。

            2)方法2:利用參數(shù)入棧原理  
                    
            在現(xiàn)有的32位的機(jī)器上,一般通過(guò)將參數(shù)按照由低地址到高地址的順序依次入棧實(shí)現(xiàn)傳遞,因此把第一參數(shù)的指針依次增加,就可以得到后面的參數(shù)了。例如:

            1.        struct s1 

            2.        {

            3.            int a;

            4.            char b;

            5.        };

            6.         

            7.        struct s2 

            8.        {

            9.            int a;

            10.    };

            11.     

            12.    void function (struct s1 a, ...) 

            13.    {

            14.        struct s1*  pa = &a;

            15.        printf("%d, %c\n", pa->a, pa->b);

            16.        ++pa;

            17.        printf("%d, %c\n", pa->a, pa->b);

            18.        ++pa;

            19.        printf("%d\n", (struct s2*)pa->a);  //強(qiáng)制轉(zhuǎn)換為struct s2類型

            20.    }

            21.    void main( void )

            22.    {

            23.        struct s1 a1 = {1, 'A'};

            24.        struct s1 a2 = {2, 'B'};

            25.        struct s2 a3 = {10};

            26.        function(a1, a2, a3); //a3的類型不同于a1, a2

            27.        return;

            28.    }

            29.     

                    用這種方法傳遞可變參數(shù)非常簡(jiǎn)單。


            3)方法3:用數(shù)組傳參

             

            1.        void   function(Type a[])   

            2.        {   

            3.          ...   

            4.          a[0];    

            5.          a[1];   

            6.          ...   

            7.        }

            這種方法就不嘮叨了,相信地球人都知道。       

             

            posted on 2009-08-12 12:57 肥仔 閱讀(2513) 評(píng)論(0)  編輯 收藏 引用 所屬分類: C++ 基礎(chǔ)

            99久久99久久久精品齐齐| 国产亚洲精久久久久久无码77777| 午夜视频久久久久一区 | 欧美精品福利视频一区二区三区久久久精品 | 99久久国产热无码精品免费久久久久 | 国产成人无码久久久精品一 | 色婷婷狠狠久久综合五月| 久久AV无码精品人妻糸列| 久久99热狠狠色精品一区| 久久久黄片| 久久久久久久97| 久久99精品久久久久久水蜜桃| 欧美久久亚洲精品| 久久精品无码午夜福利理论片| 99久久精品九九亚洲精品| 久久久亚洲欧洲日产国码是AV| 久久亚洲精品视频| 国产成人精品三上悠亚久久| 国产69精品久久久久99| 久久亚洲私人国产精品vA| 一级做a爰片久久毛片毛片| 亚洲第一永久AV网站久久精品男人的天堂AV| 伊人久久成人成综合网222| 久久精品一区二区国产| 久久精品国产亚洲αv忘忧草 | 99久久99久久精品国产片| 久久综合综合久久综合| 热久久最新网站获取| 国产精自产拍久久久久久蜜| 久久亚洲精品成人av无码网站| 久久伊人亚洲AV无码网站| 99久久人人爽亚洲精品美女| 久久精品国产亚洲AV麻豆网站| 久久久久亚洲AV片无码下载蜜桃| 国产成人无码精品久久久免费 | 无码8090精品久久一区| 一本久久a久久精品综合夜夜| 久久久久成人精品无码中文字幕| 亚洲天堂久久久| 亚洲国产精品无码久久久久久曰| 亚洲日韩欧美一区久久久久我|