如何将数组作为args列表传递给C中具有不同数量参数的函数

时间:2014-12-18 13:13:28

标签: c go

我想知道如何将C中的数组梳理成函数的多个参数。 在我看到来自Go(golang)的惊人的合成糖后,我想到了它。

c代码:

#include <stdio.h>
#include <stdarg.h>

// assert: all args are valid ints
void printEach(int len, ...) {
        // Irrelevant, this function print their arguments
        // And I know how to use va_start, va_arg...
}

void handleVet(int* v, int n) {
   // **HERE is my the question!!!**
   printEach(n, v[0]...[n]) // <----------- NON-C code. I need it.
}

int main(void) {
    int v[] = {12,14,15,15};
    //I can do that only because the vector is static. I know the len when I'm coding
        printEach(4, v[0],v[1],v[2],v[3]);
    // But if we imagine an arbitrary vector, we got a problem 
       handleVet(v, 4);
    return 0;
}

通过示例,在go中它将是:

package main

import "fmt"

func printEach (v ...int64) {
    // Irrelevant, this function print their arguments
}

func main() {
    var arr []int64 = []int64{1,14,15,}
    printEach(arr...)
}

如何在C 中实现“printEach(arr ...)”的相同效果?

3 个答案:

答案 0 :(得分:0)

您需要指定数组的大小。这是它的样子:

void printEach(int* values, int size)
{
  if(size==0)
    return;
  printf("%d", value[0]);
  printEach(values+1, size-1);
}

答案 1 :(得分:0)

这是关于vararg如何在C中工作的一个基本示例。 我无法对你的例子进行修改,因为我不知道你的代码是做什么的。我希望这个最小的例子足够清楚。如果您有任何问题请问我,我会在其中进行编辑。

void Foo(size_t sizeParamAmount, char *types, ...);
void Foo(size_t sizeParamAmount, char *types, ...)
{
    size_t i;
    float fTmp;
    int iTmp;    
    va_list vlArgList;

    va_start (vlArgList, sizeParamAmount);

    for (i= 0; i< sizeParamAmount; i++)
    {
        switch (types[i])
        {           
            case 'i':
                iTmp = va_arg (vlArgList, int));
                break;
            case 'f':
                fTmp = va_arg (vlArgList, float));
                break;
            default:
                return;//error
        }
    }
    va_end(vlArgList);
}

阅读完编辑后:

正如我在最小的例子中所做的那样,你可以在var_arg之前提交一个指针,它解释了哪个参数属于什么类型。所以你可以这样叫Foo

Foo (3, "ifi", 3, 5.973, 92);

在看完你对另一个答案的评论后,我得到了你所问的内容。

在这种情况下,你真的应该输入一个指针(或者没有[]的数组表示相同的情况),它保存了一个结束内容标记。

无论如何有一种方法。但是你必须对预处理令牌感到不满。

并且完全可以满足您的需求。无论如何,这个答案会给你所要求的符号。你必须通过sizeof(yourarray)为PRED设置限制,并且让OP采用单个元素。

https://stackoverflow.com/a/10542793/2003898

但遗憾的是没有一个更小的例子。

答案 2 :(得分:0)

您正在寻找Variadic功能,您应该看一下 stdarg.h and varargs.h