我想知道如何将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 ...)”的相同效果?
答案 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