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

标签 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...)”相同的效果

最佳答案

这是关于 vararg 如何在 C 中工作的基本示例。 我无法引用您的 go 示例,因为我不明白您的代码的作用。我希望这个最小的例子足够清楚。如果您有任何问题,请问我,我会进行编辑。

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);

在阅读了您对另一个答案的评论后,我明白了您的问题。

在这种情况下,您真的应该提交一个包含结束内容标记的指针(或没有 [] 的数组在这种情况下表现相同)。

总之还是有办法的。但你不得不为预处理 token 而烦恼。

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

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

但遗憾的是,没有比这更简单的例子了。

关于c - 如何将数组作为参数列表传递给 C 中具有不同数量参数的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27547433/

相关文章:

c - 竞争条件也可能发生在传统的单线程程序中 - Clarity

html - 如何将图像插入 HTML Golang 文件?

c - 进程如何就 IPC 参数进行通信?

go - Golang 中的持久化调度

go - 在新包中使用标志值

go - 实现相同接口(interface)的不同返回值的接口(interface)转换

concurrency - Go Memory Model文档中给出的这个例子失败的原因是什么?

c - 当进程刚刚运行命令 'true' 时,WIFEXITED(status) 会是什么?

c - 编写线程安全 UNIX 代码的技巧?

c - 使用 fgetc(stdin) 时未定义的行为