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