我破解了一些旧的C API,得到了一个编译错误,代码如下:

void OP_Exec( OP* op , ... )
{
    int i;
    va_list vl;
    va_start(vl,op);
    for( i = 0; i < op->param_count; ++i )
    {
        switch( op->param_type[i] )
        {
            case OP_PCHAR:
                op->param_buffer[i] = va_arg(vl,char*); // ok it works
            break;
            case OP_INT:
                op->param_buffer[i] = &va_arg(vl,int); // error here
            break;
            // ... more here
        }
    }
    op->pexec(op);
    va_end(vl);
}

gcc version 4.4.1 (Ubuntu 4.4.1-4ubuntu9)的错误
是:
 main.c|55|error: lvalue required as unary ‘&’ operand

那么,为什么这里不可能有一个指向论点的指针呢?
怎么解决这段代码经常用不同的OP*执行,所以我不想分配额外的内存。
是否可以在只知道参数大小的va_列表上迭代?

最佳答案

由于无法修改pexec()函数,因此litb's answer对您不可用,如果编译器提供了alloca()函数,则可以使用alloca()修复此问题:

    switch( op->param_type[i] )
    {
        int *itmp;

        case OP_PCHAR:
            op->param_buffer[i] = va_arg(vl,char*); // ok it works
        break;

        case OP_INT:
            itmp = alloca(sizeof(int));
            *itmp = va_arg(vl, int);
            op->param_buffer[i] = itmp;
        break;
        // ... more here
    }

通常是盲目快速的,因为它通常使用与为局部变量分配空间相同的机制来实现。当调用函数退出时,空间将自动释放。

关于c - 如何获得va_arg的地址?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2670850/

10-10 17:24