有一個函數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);
獨立...
你包含什麼頭文件來定義va_ *宏?它是stdarg.h嗎?可能varargs.h可以幫助嗎? –
您是否嘗試編譯沒有進行優化? –
是的,它的Debug-Build沒有任何優化 - 但這不應該有影響,發佈版本也應該工作!? – Elmi