2013-02-04 92 views
1

有一個函數my_init(...)使用可變參數列表。這個列表的長度是未知的,但最多有100個,元素總是char數組(意味着純C的字符串)。未知長度的可變參數列表的問題

這就是我試圖把它們解碼:

void my_init(...) 
{ 
    va_list vl; 
    int  tagCnt,tagLen=100; 
    char *listTag,*listValue; 

    va_start(vl,tagLen); 
    for (tagCnt=0; tagCnt<50; tagCnt++) 
    { 
     listTag=va_arg(vl,char*); 
     if (listTag==0) break; 
     listValue=va_arg(vl,char*); 

     ... // do some usefult things here 
    } 
    va_end(vl); 
} 

...我調用這個函數是這樣的:

my_init("tag1","value1", 
     "tag2","value2", 
     0); 

因此,可以一直對和一個列表的末尾標不幸的是,my_init()在調用va_start()後失敗,包含一些與輸入參數無關的廢話,並且對va_arg()的調用返回無效指針。那麼我的代碼有什麼問題?

上面給出縮短了一點,所以可能不會編譯代碼...

謝謝!

============================================== ====================================

編輯:

我改變了代碼和調用這種方式:

從使用的頭文件,現在我得到我的VL,stdargs.h或varargs.h中其他垃圾不有所作爲
void my_init(int dummy,...) 
{ 
    va_list vl; 
    int  tagCnt,tagLen=100; 
    char *listTag,*listValue; 

    va_start(vl,dummy); 
    for (tagCnt=0; tagCnt<50; tagCnt++) 
    { 
     listTag=va_arg(vl,char*); 
     if (listTag==0) break; 
     listValue=va_arg(vl,char*); 

     ... // do some usefult things here 
    } 
    va_end(vl); 
} 

my_init(0, 
     "tag1","value1", 
     "tag2","value2", 
     0); 

獨立...

+0

你包含什麼頭文件來定義va_ *宏?它是stdarg.h嗎?可能varargs.h可以幫助嗎? –

+0

您是否嘗試編譯沒有進行優化? –

+0

是的,它的Debug-Build沒有任何優化 - 但這不應該有影響,發佈版本也應該工作!? – Elmi

回答

1

的第二個參數va_start必須是最後的命名函數參數。換句話說,規範的用法是這樣的:

void my_func(int arg1, float arg2, ...) { 

    va_list vl; 

    va_start(vl, arg2); 

    // Stuff 
} 
+0

沒有功能參數,只接受變量列表。那麼沒有辦法在沒有的情況下實現它? – Elmi

+1

@Elmi:沒錯。您至少需要一個命名參數。 –