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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c语言如何封装一个带有可变参数的方法?相关的知识,希望对你有一定的参考价值。

比如说有个方法是这样的
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;
参考技术A 因为va_start, va_arg, va_end等定义成宏,所以它显得很愚蠢, 可变参数的类型和个数完全在该函数中由程序代码控制,它并不能智能地识别不同参数的个数和类型。
有人会问:那么printf中不是实现了智能识别参数吗?那是因为函数printf()是从固定参数format字符串来分析出参数的类型,再调用va_arg的来获取可变参数的。也就是说,你想实现智能识别可变参数的话是要通过在自己的程序里作判断来实现的。
另外有一个问题,因为编译器对可变参数的函数的原型检查不够严格,对编程查错不利。如果simple_va_fun()改为:
参考技术B 第一,C里没有方法,只有函数
第二,可以使用vsprintf来代替sprintf
http://baike.baidu.com/link?url=iD6CyTxyVttKGstaTFti-mRkgMvPwZFQ2zqjotAKXqlYAOashNKItRiL_OpPCvkwfBvRA73ckXhztVzENgK-l_本回答被提问者采纳

以上是关于c语言如何封装一个带有可变参数的方法?的主要内容,如果未能解决你的问题,请参考以下文章

C语言可变参数

C语言可变参数

C语言基础:可变参数

C语言中如何实现可变参函数

如何使用 SWIG 包装带有可变参数的 C 函数

c语言可变参数是干啥的