c语言传递变长参数

2025-01-01 22:44:02
推荐回答(3个)
回答1:

按照你现在给出的代码,
print2(3, 100, 1, 2, 3);

输出的是1 2 3加上一位不确定值
因为va_start(vl, n);这一步理论上可以得到以a开头的va_list指针,但实际上由于编译器优化,它的效果和va_start(vl, a);是相同的

这一点,你可以打印出指针地址来确定一下

从你的代码推测,你是想让print2打印出后四个参数,包括a在内
即 100 1 2 3
如果是这样 可以用另一种方式做到

print2中,不要调用va_start
而是直接 vl=&a;

如下
void print2(int n, int a, ...)
{
va_list vl;
// va_start(vl, n);//使用倒数第二个有名变量

vl = &a;//编译器想优化 不让。 直接强势插入
vprint(n+1, vl);

va_end(vl);
}
可以试一下是否是你需要的效果。 如果不是 再追问

回答2:

这个在c++中叫重载,每个不定的参数个数的函数名字可以相同,系统根据参数的类型、个数会自动调用相应的函数来进行编译
这不同的参数类型、个数的子函数需要都写好

这个在重载中有详细的介绍,你可以看看

回答3:

C语言中有一种长度不确定的参数,形如:"…",它主要用在参数个数不确定的函数中,我们最容易想到的例子是printf函数。
下面举个例子
  原型:

  int printf( const char *format [, argument]... );

  使用例:

  printf("Enjoy yourself everyday!\n");

  printf("The value is %d!\n", value);

  这种可变参数可以说是C语言一个比较难理解的部分,这里会由几个问题引发一些对它的分析。

  注意:在C++中有函数重载(overload)可以用来区别不同函数参数的调用,但它还是不能表示任意数量的函数参数。