【问题标题】:Problems with variable argument list of unknown length未知长度的可变参数列表的问题
【发布时间】:2013-02-04 14:02:36
【问题描述】:

有一个函数 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);

所以总是有对,列表的末尾用 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 没有任何区别...

【问题讨论】:

  • 你包含什么头文件来定义 va_* 宏?是stdarg.h吗?可能 varargs.h 可以提供帮助?
  • 你尝试编译没有优化?
  • 是的,它是一个没有任何优化的 Debug-Build - 但这不应该有影响,发布版本也应该可以工作!?
  • 你能提供minimal test-case吗?
  • 好的,解决了 - 我使用了一个中间步骤,将 arglist 交给了另一个函数 - 这是以错误的方式完成的。

标签: c variadic-functions


【解决方案1】:

va_start 的第二个参数必须是最后一个命名函数参数。换句话说,规范用法是这样的:

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

    va_list vl;

    va_start(vl, arg2);

    // Stuff
}

【讨论】:

  • 没有功能参数,只接受变量列表。那么没有办法实现它吗?
  • @Elmi:没错。您至少需要一个命名参数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-25
相关资源
最近更新 更多