2013-02-04 48 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:没错。您至少需要一个命名参数。 –