2012年2月1日 星期三

C語言不定參數

在C 語言我們常常見到不定參數的使用,像是 prinft() 與 scanf() 
這些函數的定義使用符號 ... 來表示不定參數,如int printf( const char* format, ...);
在內部則是使用 va 系列巨集來實現的
   va_list                                          //不定長度型態

   void va_start( va_list arg_ptr, prev_param );    //啟始不定長度引數的巨集
   type va_arg( va_list arg_ptr, type );            //讀取不定長度引數的巨集
   void va_end( va_list arg_ptr );                  //結束不定長度引數的巨集 


va 系列的巨集定義如下:
#define _INTSIZEOF(n) ((sizeof(n)+sizeof(int)-1)&~(sizeof(int)-1)) 

#define va_start(ap,v) ( ap=(va_list)&v + _INTSIZEOF(v)) 
#define va_arg(ap,t) (*(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t))) 
#define va_end(ap) (ap = (va_list)0 )

簡單的範例:

#include 
#include 
#include 
void CLI_TMP(unsigned int type,...);

int main(int argc, char *argv[])
{
    char d[10]="ABC";
    
    CLI_TMP(0,10,20,30,d,"ddsfssf",'c');


    system("PAUSE");
    return 0;
}

void CLI_TMP(unsigned int type,...)
{
    va_list argptr;
    char temp_buf[256];
    int a,b,c;
    char *d,*e;
    char f;
    
    va_start(argptr, type);

    a = va_arg (argptr,int);
    b = va_arg (argptr,int);
    c = va_arg (argptr,int);
    d = va_arg (argptr,char*);
    e = va_arg (argptr,char*);
    f = va_arg (argptr,int);
    
    strcat(d,"aaa");
    va_end(argptr);
    
    printf("%d,%d,%d,%s,%s,%c\n",a,b,c,d,e,f);
} 

link from:http://blog.yam.com/ddy1280/article/2095414

沒有留言:

張貼留言

DNSSEC安全技術簡介 作者:游子興 / 臺灣大學計算機及資訊網路中心網路組約聘幹事 DNS 是一套已經廣泛使用的Internet 服務,但因先天的技術限制導致容易成為駭客攻擊的目標。本文主要在介紹DNSSEC 之緣起與技術背景,及其使用的加解密技術如何確保資料的完整...