c语言如何封装一个带有可变参数的方法?

比如说有个方法是这样的intsprintf(char*buffer,constchar*format,[argument]…);它后面的参数是可变的,我需要写一个方法去封... 比如说有个方法是这样的
int sprintf( char *buffer, const char *format, [ argument] … );
它后面的参数是可变的,我需要写一个方法去封装这个方法foo,也需要封装这个方法,那我可以这么:
void foo(const char *format,...);
现在的问题是,我怎么foo的可变参数传递给sprintf呢?
展开
 我来答
风若远去何人留
推荐于2018-03-29 · 知道合伙人互联网行家
风若远去何人留
知道合伙人互联网行家
采纳数:20412 获赞数:450126
专业C/C++软件开发

向TA提问 私信TA
展开全部

需要借用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;
}
安藤沙耶香Ando
2014-01-15 · TA获得超过128个赞
知道答主
回答量:99
采纳率:0%
帮助的人:79.7万
展开全部
因为va_start, va_arg, va_end等定义成宏,所以它显得很愚蠢, 可变参数的类型和个数完全在该函数中由程序代码控制,它并不能智能地识别不同参数的个数和类型。
有人会问:那么printf中不是实现了智能识别参数吗?那是因为函数printf()是从固定参数format字符串来分析出参数的类型,再调用va_arg的来获取可变参数的。也就是说,你想实现智能识别可变参数的话是要通过在自己的程序里作判断来实现的。
另外有一个问题,因为编译器对可变参数的函数的原型检查不够严格,对编程查错不利。如果simple_va_fun()改为:
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
shine1991
科技发烧友

2014-01-15 · 智能家居/数码/手机/智能家电产品都懂点
知道顶级答主
回答量:4.7万
采纳率:82%
帮助的人:2.3亿
展开全部
第一,C里没有方法,只有函数
第二,可以使用vsprintf来代替sprintf
http://baike.baidu.com/link?url=iD6CyTxyVttKGstaTFti-mRkgMvPwZFQ2zqjotAKXqlYAOashNKItRiL_OpPCvkwfBvRA73ckXhztVzENgK-l_
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式