有一个函数 my_init(...) 使用变量参数列表。该列表的长度未知,但最多为 100,并且元素始终是字符数组(意味着纯 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);
所以总是有对,列表的末尾用 0 标记。不幸的是 my_init() 失败,在调用 va_start() 之后,vl 包含一些与输入参数无关的废话,并且对 va_arg() 的调用返回无效指针. 那么我的代码有什么问题?
上面给出的代码被缩短了一点,所以它可能无法编译......
谢谢!
==================================================== =================================
编辑:
我更改了代码并以这种方式调用:
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);
独立于使用的头文件,我现在在我的 vl 中得到其他废话,stdargs.h 或 varargs.h 没有任何区别......