㈠ c语言传递变长参数
按照你现在给出的代码,
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);
}
可以试一下是否是你需要的效果。 如果不是 再追问
㈡ java 可变参数是什么
java 可变参数是1.5版本的新特性,也就是说用户若是想定义一个方法,但是在此之前并不知道以后要用的时候想传几个参数进去,可以在方法的参数列表中写参数类型或者数组名,然后在方法内部直接用操作数组的方式操作。
java可变长的形参声明格式:dataType...parameters。
其中,省略号表示数据类型为dataType的parameters参数个数不固定的,可为任意个。此外,在方法调用时,变长形式参数可被替换成1个、2个或多个参数。在编译时,方法的变长参数将被看成具有相同类型的一维数组。
在java语言开发中,从JDK1.5以后,java允许定义形参长度可变的参数从而允许为方法指定数量不确定的形参。
㈢ java 函数参数object...这样的变长参数调用的时候可以省略不写吗
可以,这就是java的不定长参数,下面进行简要介绍:
先看两个简单的例子,来感受一下Java的不定长度参数
第一个例子:
public class VariArgs {
public static void main(String[] args) {
test();
test("aaa");
test("aaa", "bbb");
test("aaa", "bbb", "ccc");
}
public static void test(String... args) {
System.out.println(args.getClass());
for (String arg : args) {
System.out.println(arg);
}
}
}
第二个例子:
public class VariArgs {
public static void main(String[] args) {
test("aaa");
test("aaa", "bbb");
test("aaa", "bbb", "ccc");
}
public static void test(String arg, String... args) {
System.out.println(arg);
System.out.println("----------------");
for (String s : args) {
System.out.println(s);
}
}
}
从上面可以看出,如果一个方法的参数定为不定参数的话,这个参数可以根据参数个数动态生成一个数组,然后传入方法执行。
不过,不定参数有两个规定:第一,方法的参数列表中最多只有一个不定长度的参数;第二,就是不定长度的数组的位置必须是最后一个参数。不然不能通过编译。
对于第一个规定,是因为如果有多于一个不定长度的参数,当真正调用这个方法的时候,JVM、将不知道前面的不定长度参数有多长, 下一个参数是从哪里开始.
对于第二个参数也是一样,编译器不知道不定长度参数的长度,无法确定从哪里开始下一个参数。
㈣ 关于标准C语言参数个数的问题
标准C不像C++一样支持可变形参数量?
那printf算什么?
是四个参数,要是加逗号不可能通过编译。
宏不就是替代吗?
c++的话,就是
CvMat cvMat( int rows, int cols, int type, void* data =NULL)//缺省参数
{
}
c的话,没有默认参数,所以调用时最后一个参数必须的
CvMat cvMat( int rows, int cols, int type, void* data)
{
}
㈤ 影响vs编译速度的因素有哪些
影响因素比较多:
1 文件的大小,文件大小指的是全部include展开后的大小。
2 文件数量,编译是一个一个文件进行的,所以你的工程的文件数量也有关系。
3 还有声明的复杂程度,复杂声明需要额外地计算。
4 最影响编译速度的估计是C++的模板,模板在编译的时候要进行推导,得到相应的结果,这个非常费时间。如果你是模板里还套了模板,那就比较慢了。
5 链接库的数量,链接很多库也会使得编译速度变慢。
6 inline函数展开,会使得代码膨胀,也会影响编译速度
7 debug模式编译要留符号表做调试,也会影响速度
8 release模式如果开了优化,编译优化会改变代码的某些结构,这也是拖慢编译器的一个重要因素。
㈥ 模板函数为什么类型参数可以不止一个
不知道你说的是模板函数的定义还是它的调用。
对于定义:
模板函数可能不止包含一个参数,可能多个参数都要设计成通用的,所以需要让它们都变成可变的(对于一个可变的参数,在调用时会被实例成一个确定的参数,所以不可能既是A又是B)
对于调用:
因为定义模板函数时没有给出参数类型,所以需要给它们一个确定的类型,否则编译器无法确定该把他们的处理用什么命令来实现。如果这个模板函数有多个可变参数,显然需要给它们分别指定类型。
㈦ 3. 如果一个函数参数列表很长,那么会带来怎样的负担你有什么解决方案
首先一个前提是这些参数都是有用的,在这个前提下讨论办法。函数的参数列表很长,不仅书写麻烦,阅读也不便,而且太长的列表容易写错,造成编译错误,影响调试时效。
1.可以把函数重载为多个形参较少的同名函数;
2.参数列表长,但每次调用往往用不了全部,可以定义一些默认参数,并安排好顺序,调用时就可以少写不少,节省很多功夫;
3.如果是现成的长参数列表函数,在你的程序中用的参数又并不多,可以根据需求重写一个参数较少的函数调用它;只做一次的事再复杂也较易解决;
4.如果调用时每个参数都得用,那只好认了;这正是长参数列表存在的意义。