c语言如何封装一个带有可变参数的方法? 如何在C语言中实现可变长度的参数

作者&投稿:羽律 (若有异议请与网页底部的电邮联系)

需要借用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()改为:

第一,C里没有方法,只有函数
第二,可以使用vsprintf来代替sprintf
http://baike.baidu.com/link?url=iD6CyTxyVttKGstaTFti-mRkgMvPwZFQ2zqjotAKXqlYAOashNKItRiL_OpPCvkwfBvRA73ckXhztVzENgK-l_

c语言如何定义一个可变参数函数 如何调用其输入的参数 分别~

有专门的宏,处理可变参
void va_start( va_list arg_ptr, prev_param );type va_arg( va_list arg_ptr, type );void va_end( va_list arg_ptr );
一个简单的例子
void simple_va_fun(int i, ...){va_list arg_ptr;int j=0;va_start(arg_ptr, i);j=va_arg(arg_ptr, int);va_end(arg_ptr);printf("i=%d j=%d\bn", i, j);return;}int main(){ simple_va_fun(1); simple_va_fun(1,2); simple_va_fun(1,200); return 0;}

C语言实现可变长度字符串,主要依靠realloc函数实现,主要代码如下,
//程序功能,判断插入字符长度len,若大于预设大小n,调整字符串数组大小,实现动态处理数组大小。
#include
#include
#include

int main(int argc, char *argv[])
{
char * pstr = NULL;
int n=10;//字符串初始大小
char str[100];//待插入字符串
int len=0;//待插入字符串长度
pstr = (char*)malloc(sizeof(char)*n);//申请sizeof(char)*n个大小的内存空间
if (pstr==NULL)
{
printf("内存申请出错,程序退出!
");
exit(1);
}

c语言如何封装一个带有可变参数的方法?
答:(1)首先在函数里定义一具VA_LIST型的变量,这个变量是指向参数的指针;(2)然后用VA_START宏初始化刚定义的VA_LIST变量;(3)然后用VA_ARG返回可变的参数,VA_ARG的第二个参数是你要返回的参数的类型(如果函数有多个可变参数的,依次调用VA_ARG获取各个参数);(4)最后用VA_END宏结束可变参...

printf这样参数可变的函数如何封装
答:|第一个可变参数 | ->va_start(arg_ptr,start)后arg_ptr所指的地方 | | 即第一个可变参数的地址 |——— | |——— ——| | | |最后一个固定参数 | -> start的起始地址 |——— —| ...|——— | | | |——— |-> 低内存地址处 三.printf研究 下面是一个简单的printf函数...

c语言 怎么写 可变 参数函数
答:include <stdarg.h> //可变参数函数必要的头文件#include <stdio.h>long int sum(unsigned int argc,...) //可变参数函数必须包含至少一个确定的参数{long int srt=0;int va;unsigned int i;va_list vl; //用于指向可变参数列表va_start(vl,argc); //初始化,va_start()调用...

c语言怎么对可变长的参数宏再封装新宏?
答:一样方式就可以 define my_Printf(fmt, ...) ex_printf(fmt, ##__VA_ARGS__)也可以 define my_Printf(fmt, args...) ex_printf(fmt, ##args)手机打字,没管大小写,领会精神就好

如何在C语言中定义参数数目可变的函数
答:定义如下:<函数返回值> 函数名(形参1, 形参2, ...)举例说明:int func(int a, int b, ...){ //函数体 ...} printf()函数就是一个参数可变的函数,其函数原型为:int printf (const char *__format, ...);

c#可变参数params的介绍
答:官方解读</: params在C#中扮演着"可变参数"的角色,它允许你在方法声明中指定参数数量不固定的一维数组。重要的是,params之后不允许额外参数,且只能有一个。使用时,你可以通过以下方式调用方法:一个元素类型的参数,以逗号分隔。一个指定类型的参数数组。无需传入参数,此时params数组为空。static void...

c语言如何定义一个可变参数函数 如何调用其输入的参数 分别
答:有专门的宏,处理可变参 void va_start( va_list arg_ptr, prev_param );type va_arg( va_list arg_ptr, type );void va_end( va_list arg_ptr );一个简单的例子 void simple_va_fun(int i, ...){va_list arg_ptr;int j=0;va_start(arg_ptr, i);j=va_arg(arg_ptr, int)...

Java中方法内的可变参数怎么使用
答:(1)、只能出现在参数列表的最后;(2)、...位于变量类型和变量名之间,前后有无空格都可以;(3)、调用可变参数的方法时,编译器为该可变参数隐含创建一个数组,在方法体中一数组的形式访问可变参数。public class Varable { public static void main(String [] args){ System.out.println(add(...

C语言奇淫技巧之函数的可变参数
答:有时候我们需要一个函数接口可以支持可变参数以提高其泛化能力,比如说定义一个求和函数,对传入的所有参数进行求和并返回,C语言提供了一种可变参数的方式来帮助我们实现。原理:函数参数是从右向左线性连续依次入栈,如果我们可以知道可变参数列表的前一个参数的地址和类型,就可以得知可变参数列表的首地址...

c/c++支持可变参数的函数
答:下面通过若干例子,说明如何实现可变参数函数的定义和调用。//=== 例子程序1 === #i nclude stdio.h > #i nclude string.h > #i nclude stdarg.h > /* 函数原型声明,至少需要一个确定的参数,注意括号内的省略号 */ int demo( char *, ... );void main( void ){ demo( "DE...