• <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, 評論 - 661, 引用 - 0
            數(shù)據(jù)加載中……

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

                   有時候,我們寫函數(shù)的時候,可能遇到參數(shù)數(shù)量不確定的情況,這樣的函數(shù)例如Cprintf打印函數(shù)。你可以使用printf("some string"), 也可以使用printf("%d", aintvalue)。是不是C的庫里包含了不同定義的printf函數(shù)呢?答案肯定是否定的,因為C是不支持函數(shù)的重載的。每個函數(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
            :第一個參數(shù)的類型

                     下面采用msdn里的一個例子。

            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

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

            2)方法2:利用參數(shù)入棧原理  
                    
            在現(xiàn)有的32位的機器上,一般通過將參數(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);  //強制轉(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ù)非常簡單。


            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) 評論(0)  編輯 收藏 引用 所屬分類: C++ 基礎(chǔ)

            久久精品国产欧美日韩| 亚洲精品无码久久久久| 国产精品亚洲综合专区片高清久久久 | 久久精品国产亚洲AV麻豆网站| 久久午夜无码鲁丝片| 国产AV影片久久久久久| 伊人 久久 精品| 国产午夜精品理论片久久影视| 成人午夜精品久久久久久久小说| 久久精品国产免费观看 | 久久人人爽人人爽AV片| 久久人人爽人人爽人人片av麻烦| 久久精品国产亚洲77777| 一本久道久久综合狠狠躁AV| 久久精品国产亚洲av水果派| 色播久久人人爽人人爽人人片aV| 久久国产精品成人片免费| 亚洲日本va午夜中文字幕久久| 国产精品美女久久久m| 伊人久久精品无码av一区| 久久高潮一级毛片免费| 国产产无码乱码精品久久鸭| 国产精品99久久久精品无码| 久久亚洲2019中文字幕| 777久久精品一区二区三区无码| 色婷婷久久综合中文久久蜜桃av| 久久久久国产视频电影| 国产精品伊人久久伊人电影| 久久电影网一区| 久久伊人精品青青草原高清| 麻豆AV一区二区三区久久 | 日日噜噜夜夜狠狠久久丁香五月| 亚洲性久久久影院| 午夜精品久久久久久影视777| 国产一区二区精品久久岳| 国产激情久久久久影院老熟女免费| 精品国产一区二区三区久久久狼| 久久综合给合久久狠狠狠97色69 | 久久精品久久久久观看99水蜜桃| 无码乱码观看精品久久| 久久久久久久综合狠狠综合|