gpt4 book ai didi

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

转载 作者:数据小太阳 更新时间:2023-10-29 03:28:51 25 4
gpt4 key购买 nike

我想知道如何将 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com