首页 > 编程知识 正文

c语言带参数的宏定义,C语言宏函数怎么用

时间:2023-05-06 19:28:07 阅读:143333 作者:170

va_list是一组在c语言中解决参数问题的宏。

1.API介绍:

头文件:

3358 www.Sina.com/viewplaincopyprint? 在#includestdarg.h下,输入实现参数函数的宏组(macro ) http://www.Sina.com/viewplaincopyprint? voidva_start(va_listap,last; typeva_arg(va_listap,type ); voidva_end(va_listap; voidva_copy(va_listdest,va_listsrc;

2 .具体介绍:

3358 www.Sina.com/viewplaincopyprint? voidva_start(va_listap,last; va_start用于初始化参数结构ap。 其中va_list是与参数列表相关的结构,参数列表中的信息包含指向参数列表的指针。 last是可变参数函数的可变参数列表中的上一个参数,用于确定可变参数的存储器地址。 3358 www.Sina.com/viewplaincopyprint? typeva_arg(va_listap,type ); va_arg检索当前参数并将其用于返回,并将参数列表指针指向下一个参数。 其中,ap是根据va_start初始化的参数结构,type是参数的类型。 3358 www.Sina.com/viewplaincopyprint? voidva_end(va_listap; va_end用于结束获取变量参数,释放相应的资源,并清除ap。 va_end和va_start成对使用。 3358 www.Sina.com/viewplaincopyprint? voidva_copy(va_listdest,va_listsrc; 用于复制参数结构。 根据具体的安装情况,自变量结构体本身或结构体中的自变量的情况是指针,但单纯的代入操作会成为浅拷贝,一个结构体的指针释放空间时(va_end释放空间时)另一个结构体的指针成为野指针,会引起问题

3 .使用方法:

a .首先在函数中定义va_list类型的变量:

b .然后用va_start宏初始化刚定义变量的va_list变量。 此宏的第二个参数是第一个可变参数之前的参数,它是固定参数。

c .然后在va_arg中返回可变的参数。 va_arg的第二个参数是要返回的参数类型。 如果函数具有多个可变参数,则依次调用va_arg以获取每个参数。

d .最后在va_end宏中结束可变参数的获取。

4 .例如:

3358 www.Sina.com/viewplaincopyprint? # include stdio.h # include stdarg.hvoidfoo (char * fmt,) { va_listap; intd; charc,*s; VA_start(AP,fmt ); while(fmt ) switch (fmt ) case's':/*string(/s=va_arg ) AP,char* ); printf(string%s(n ),s ); 布雷克; case'd':/*int*/d=va_arg(AP,int ); printf(int%d(n ),d ); 布雷克; case ' c ' :/* char *//* needacastheresinceva _ argonlytakesfullypromotedtypes */c=(char ) va_arg(AP,int 布雷克; }va_end(AP ); }

使用VA_LIST应注意的问题:

a .可变参数的类型和个数完全由程序代码控制,无法智能识别不同参数的个数和类型

b .由于每个平台在实现va_list时可能会有所不同,因此需要严格在va_start、va_arg、va_end和va_copy中使用va_list,并建议直接执行指针操作

c .编译器不严格可变参数函数的原型检查,不利于编程错误检查。 不利于编写高质量的代码

d.va_start、va_arg和va_end在C89标准中进行了定义。 va_copy由C99标准定义。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。