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

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

本文目录导航:

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 );

一个便捷的例子

可变参函数的可变参函数的成功

C编译器理论提供了一系列解决这种状况的宏,以屏蔽不同的配件平台形成的差异,参与程序的可移植性。

这些宏包含va—start、va—arg和va—end等。

经常使用这些宏有两种不同的方式,二者在程序中包含的头文件不同,宏的定义也存在一些差异。

这两种方式对应的头文件和宏的申明见表1。

驳回ANSI规范方式时,参数个数可变的函数的原型申明是:type funcname(type para1, type para2, ...)这种方式至少须要一个个别的方式参数,前面的省略号不示意省略,而是函数原型的一局部,type是函数前往值和方式参数的类型。

驳回与UNIX System V兼容的申明方式时,参数个数可变的函数原型是:type funcname(va—alist)va—dcl这种方式不须要提供任何个别的方式参数,type是函数前往值的类型。

va—dcl是对函数原型申明中参数va—alist的详细申明,实践是一个宏定义,对不同的配件平台驳回不同的类型来定义,但在最后都包含了一个分号,因此va—dcl后不再须要加上分号了。

va—dcl在代码中必定原样给出,va—alist在VC中可以原样给出,也可以略去,但在UNIX上的CC或Linux上的GCC中都要省略掉。

此外,驳回头文件stdarg.h编写的程序是合乎ANSI规范的,可以在各种操作系统和配件上运转,而驳回头文件varargs.h的方式仅仅是为了与以前的程序兼容。

所以倡导大家经常使用前者。

两种方式的基本原理是分歧的,只是在语法方式上有一些纤细的区别。

以下重要就前一种方式对参数的解决做出说明。

va—start使argp指向第一个可选参数。

va—arg前往参数列表中的以后参数并使argp指向参数列表中的下一个参数。

va—end把argp指针清为NULL。

函数体内可以屡次遍历这些参数,然而都必定以va—start开局,并以va—end开头。

调用者在实践调用参数个数可变的函数时,要经过必定的方法指明实践参数的个数,例如把最后一个参数置为空字符串(系统调用execl()就是这样的)、-1或其余的方式。

上方给出一个详细的例子,前一局部是驳回了合乎ANSI规范方式的代码,后一局部是驳回了与UNIX System V兼容方式的代码。

代码中加了一些注释,这里就不再解释了。

该例子曾经在VC/Windows NT4.0、CC/AIX4.3.2.0、GCC/Redhat Linux 6.0环境下编译并反常运转。

1.展示如何经常使用参数个数可变的函数,驳回ANSI规范方式#include 〈stdio.h〉#include 〈string.h〉#include 〈stdarg.h〉/* 函数原型申明,至少须要一个确定的参数,留意括号内的省略号*/int demo( char*, ... );void main( void ){demo(″DEMO″, ″This″, ″is″, ″a″, ″demo!″, ″″);}/* ANSI规范方式的申明方式,括号内的省略号示意可选参数 */int demo( char *msg, ... ){va—list argp;/* 定义保留函数参数的结构 */int argno = 0; /* 纪录参数个数 */char *para;/* 寄存取出的字符串参数*//* argp指向传入的第一个可选参数,msg是最后一个确定的参数 */va—start( argp, msg );while (1) {para = va—arg( argp, char ?);/* 取出以后的参数,类型为char *. */if ( strcmp( para, ″″) == 0 )/* 驳回空串批示参数输入完结 */break;printf(″Parameter #%d is: %s\n″, argno, para);argno++;}va_end( argp ); /* 将argp置为NULL*/return 0;}

如何在一个可变参数函数中调用另一个可变参数函数

无方法间接做到这一点,不过可以驳回其余方法成功,例如:首先,定义被调用函数的参数为va_list类型,同时在调用函数中将可变长参数列表转换为va_list,这样就可以启动变长参数的传递了。看如下所示: void subfunc (char *fmt, va_list argp){ = va_arg (fmt, argp); /* 从argp中逐个取出所要的参数 */...} void mainfunc (char *fmt, ...){va_list argp;va_start (argp, fmt); /* 将可变长参数转换为va_list */subfunc (fmt, argp); /* 将va_list传递给子函数 */va_end (argp);...}这样就OK了!

你可能想看:
« 上一篇
下一篇 »

相关推荐

FreeBasic:强大免费开源的64位basic编译器及应用优势

2025年05月10日

82阅读

脊柱侧弯矫正方法大盘点:运动康复、支具矫正等多种方式

2025年05月09日

88阅读

如何在winForm标题栏去掉标题文字且任务栏图标正常显示

2025年05月09日

86阅读

十一黄金周促销广告词大全,国庆购物狂欢等你来

2025年05月09日

78阅读

关闭快速编辑模式及插入模式,设置控制台指定文字颜色举例

2025年05月09日

63阅读

黄金搭档低糖高钙饮品包装及成分功效全解析,适合人群要知晓

2025年05月09日

91阅读