如何访问变参数函数最后一个参数
2个回答
展开全部
通常我们使用的C函数的参数个数都是固定的,但也有不固定的。比如printf()与scanf()。如何自己动手实现一个可变参数函数,这个还是有点技巧的。
我们最常用的就是定义一个宏,使用printf或者printk,如下
#define wwlogk(fmt, args...) printk(fmt, ## args)
现在我们自己动手实现一个可变参数的函数,后面分析原理。首先看一个例子:
#include <stdio.h>
#include <stdarg.h>
int Sum(int first, int second, ...)//当无法列出传递函数的所有实
//参的类型和数目时,可用省略号指定参数表
{
int sum = 0, t = first;
va_list vl;
va_start(vl, first);
while (t != -1){
sum += t;
t = va_arg(vl, int); //将当前参数转换为int类型
}
va_end(vl);
return sum;
}
int main(int argc, char* argv[])
{
printf("The sum is %d\n", Sum(30, 20, 10, -1)); //-1是参数结束标志
return 0;
}
在上面的例子中,实现了一个参数个数不定的求int型和的函数Sum()。
其中有几个变量需要说明一下。va_list、va_start()、va_end和va_arg。
Va_list:该类型变量用来访问可变参数,实际上就是指针。
Va_start():是一个宏,用来获取参数列表中的参数,使vl指向第一个可变参数,使用完毕后调用va_end()结束。
va_end:也是一个宏,用来结束va_start()的调用。
va_arg:宏,用来获参数列表中的取下一个值。
我们最常用的就是定义一个宏,使用printf或者printk,如下
#define wwlogk(fmt, args...) printk(fmt, ## args)
现在我们自己动手实现一个可变参数的函数,后面分析原理。首先看一个例子:
#include <stdio.h>
#include <stdarg.h>
int Sum(int first, int second, ...)//当无法列出传递函数的所有实
//参的类型和数目时,可用省略号指定参数表
{
int sum = 0, t = first;
va_list vl;
va_start(vl, first);
while (t != -1){
sum += t;
t = va_arg(vl, int); //将当前参数转换为int类型
}
va_end(vl);
return sum;
}
int main(int argc, char* argv[])
{
printf("The sum is %d\n", Sum(30, 20, 10, -1)); //-1是参数结束标志
return 0;
}
在上面的例子中,实现了一个参数个数不定的求int型和的函数Sum()。
其中有几个变量需要说明一下。va_list、va_start()、va_end和va_arg。
Va_list:该类型变量用来访问可变参数,实际上就是指针。
Va_start():是一个宏,用来获取参数列表中的参数,使vl指向第一个可变参数,使用完毕后调用va_end()结束。
va_end:也是一个宏,用来结束va_start()的调用。
va_arg:宏,用来获参数列表中的取下一个值。
展开全部
通常我们使用的C函数的参数个数都是固定的,但也有不固定的。比如printf()与scanf()。如何自己动手实现一个可变参数函数,这个还是有点技巧的。
我们最常用的就是定义一个宏,使用printf或者printk,如下
#define wwlogk(fmt, args...) printk(fmt, ## args)
现在我们自己动手实现一个可变参数的函数,后面分析原理。首先看一个例子:
#include <stdio.h>
#include <stdarg.h>
int Sum(int first, int second, ...)//当无法列出传递函数的所有实
//参的类型和数目时,可用省略号指定参数表
{
int sum = 0, t = first;
va_list vl;
va_start(vl, first);
while (t != -1){
sum += t;
t = va_arg(vl, int); //将当前参数转换为int类型
}
va_end(vl);
return sum;
}
int main(int argc, char* argv[])
{
printf("The sum is %d\n", Sum(30, 20, 10, -1)); //-1是参数结束标志
return 0;
}
在上面的例子中,实现了一个参数个数不定的求int型和的函数Sum()。
其中有几个变量需要说明一下。va_list、va_start()、va_end和va_arg。
Va_list:该类型变量用来访问可变参数,实际上就是指针。
Va_start():是一个宏,用来获取参数列表中的参数,使vl指向第一个可变参数,使用完毕后调用va_end()结束。
va_end:也是一个宏,用来结束va_start()的调用。
va_arg:宏,用来获参数列表中的取下一个值。
我们最常用的就是定义一个宏,使用printf或者printk,如下
#define wwlogk(fmt, args...) printk(fmt, ## args)
现在我们自己动手实现一个可变参数的函数,后面分析原理。首先看一个例子:
#include <stdio.h>
#include <stdarg.h>
int Sum(int first, int second, ...)//当无法列出传递函数的所有实
//参的类型和数目时,可用省略号指定参数表
{
int sum = 0, t = first;
va_list vl;
va_start(vl, first);
while (t != -1){
sum += t;
t = va_arg(vl, int); //将当前参数转换为int类型
}
va_end(vl);
return sum;
}
int main(int argc, char* argv[])
{
printf("The sum is %d\n", Sum(30, 20, 10, -1)); //-1是参数结束标志
return 0;
}
在上面的例子中,实现了一个参数个数不定的求int型和的函数Sum()。
其中有几个变量需要说明一下。va_list、va_start()、va_end和va_arg。
Va_list:该类型变量用来访问可变参数,实际上就是指针。
Va_start():是一个宏,用来获取参数列表中的参数,使vl指向第一个可变参数,使用完毕后调用va_end()结束。
va_end:也是一个宏,用来结束va_start()的调用。
va_arg:宏,用来获参数列表中的取下一个值。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询