c语言如何封装一个带有可变参数的方法?
比如说有个方法是这样的intsprintf(char*buffer,constchar*format,[argument]…);它后面的参数是可变的,我需要写一个方法去封...
比如说有个方法是这样的
int sprintf( char *buffer, const char *format, [ argument] … );
它后面的参数是可变的,我需要写一个方法去封装这个方法foo,也需要封装这个方法,那我可以这么:
void foo(const char *format,...);
现在的问题是,我怎么foo的可变参数传递给sprintf呢? 展开
int sprintf( char *buffer, const char *format, [ argument] … );
它后面的参数是可变的,我需要写一个方法去封装这个方法foo,也需要封装这个方法,那我可以这么:
void foo(const char *format,...);
现在的问题是,我怎么foo的可变参数传递给sprintf呢? 展开
展开全部
需要借用C语言的VA_LIST 宏定义,及相关操作来实现可变参数。
VA_LIST 所在头文件:#include <stdarg.h>,用法如下:
(1)首先在函数里定义一具VA_LIST型的变量,这个变量是指向参数的指针;
(2)然后用VA_START宏初始化刚定义的VA_LIST变量;
(3)然后用VA_ARG返回可变的参数,VA_ARG的第二个参数是你要返回的参数的类型(如果函数有多个可变参数的,依次调用VA_ARG获取各个参数);
(4)最后用VA_END宏结束可变参数的获取。
以下是一个自定义打印接口的实现:
int my_printf(const char *fmt, ...)//...表示参数可变
{
va_list args;//定义va_list
static char gc_PrintfOutBuff[1000];
va_start(args, fmt);//初始化
vsnprintf((char *) gc_PrintfOutBuff, 1000, (char *) fmt, args);//这里没有使用VA_ARG取回单个变量,而是借用vsnprinf一次性读取。
va_end(args);//结束获取
puts("%s",(const char *)gc_PrintfOutBuff);//使用。
return 0;
}
展开全部
因为va_start, va_arg, va_end等定义成宏,所以它显得很愚蠢, 可变参数的类型和个数完全在该函数中由程序代码控制,它并不能智能地识别不同参数的个数和类型。
有人会问:那么printf中不是实现了智能识别参数吗?那是因为函数printf()是从固定参数format字符串来分析出参数的类型,再调用va_arg的来获取可变参数的。也就是说,你想实现智能识别可变参数的话是要通过在自己的程序里作判断来实现的。
另外有一个问题,因为编译器对可变参数的函数的原型检查不够严格,对编程查错不利。如果simple_va_fun()改为:
有人会问:那么printf中不是实现了智能识别参数吗?那是因为函数printf()是从固定参数format字符串来分析出参数的类型,再调用va_arg的来获取可变参数的。也就是说,你想实现智能识别可变参数的话是要通过在自己的程序里作判断来实现的。
另外有一个问题,因为编译器对可变参数的函数的原型检查不够严格,对编程查错不利。如果simple_va_fun()改为:
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
第一,C里没有方法,只有函数
第二,可以使用vsprintf来代替sprintf
http://baike.baidu.com/link?url=iD6CyTxyVttKGstaTFti-mRkgMvPwZFQ2zqjotAKXqlYAOashNKItRiL_OpPCvkwfBvRA73ckXhztVzENgK-l_
第二,可以使用vsprintf来代替sprintf
http://baike.baidu.com/link?url=iD6CyTxyVttKGstaTFti-mRkgMvPwZFQ2zqjotAKXqlYAOashNKItRiL_OpPCvkwfBvRA73ckXhztVzENgK-l_
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询