用C语言实现参数个数可变的函数

程序员通勤双肩包,下单送全年 CSDN 会员 防泼水面料电脑包,保护笔记本电脑,背负轻便,下单再赠 Coding Plan,看技术干货、查文档、下载源码,一站式搞定学习需求 阅读详情


用C语言实现参数个数可变的函数


  
    采用C语言编程的时候,函数中形式参数的数目通常是确定的,在调用时要依次给出与形式参数对应的所有实际参数。但在某些情况下希望函数的参数个数可以根据需要确定。典型的例子有大家熟悉的函数printf()、scanf()和系统调用execl()等。那么它们是怎样实现的呢?   
    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;  
     }

C语言可变参数 函数 func() 最后一个参数写成省略号,即三个点号(...),省略号之前的那个参数是 int,代表了要传递的可变参数的总数。为了使用这个功能,您需要使用 stdarg.h 头文件,该文件提供了实现可变参数功能的函数和宏。具体步骤如下: 定义一个函数,最后一个参数为省略号,省略号前面可以设置自定义参数。 在函数定义中创建一个 va_list 类型变量,该类型是在 stdarg.h 头文件中定义的。 使用 int 参数和 va_start 宏来初始化 va_list 变量为一个参数列表。宏 va_star 阅读详情

相关推荐

c语言可变个数统计实现方法

可变个数统计

wenshubiubiu的博客 659

C/C++语言获取不定参数个数以及不定参数指定参数的方法

场景 C/C++有很多场景需要用到不定参数,比如最常用的就是printf函数,后面可以按格式跟着若干个不定参数。不定参数函数中形参用...来表示,然后在函数体用va_start、va_arg、va_end这三个宏定义方法来承接不定参数,但是在承接不定参数时候,要承接多少个呢?这个通常的方法是给函数传不定参数时候也传入不定参数个数。例子如下: int adds(int num, ...) { int sum = 0; va_list args; va_start(args, num

lamdonn的博客 4471

可变参数列表源码的剖析

C语言中的可变参数 1、C语言中的可变参数列表:C语言中有时候会遇到一些参数个数可变函数,像scanf,printf等,这些函数内部的参数列表都是可变的。通过将函数实现可变参数的形式,使得函数可以接受1个以上的任意多个参数。(不固定) 如函数原型:scanf(const char * format,…); 解释:除了format以外,后面跟着的参数 个数,类型是可变的,用…作为

t_x_l_的博客 506

c语言 函数多个参数,用C语言实现参数个数可变函数

采用C语言编程的时候,函数中形式参数的数目通常是确定的,在调用时要依次给出与形式参数对应的所有实际参数。但在某些情况下希望函数参数个数可以根据需要确定。典型的例子有大家熟悉的函数printf()、scanf()和系统调用execl()等。那么它们是怎样实现的呢?C编译器通常提供了一系列处理这种情况的宏,以屏蔽不同的硬件平台造成的差异,增加程序的可移植性。这些宏包括va—start、va—arg和...

weixin_39760619的博客 1666

C语言实现参数个数可变函数

其实,我总觉得有个结论应该是必然的。既然很多语言最初都是由C语言发展来的,还有很多语言的基础是用C语言实现的。那么,这些用C语言实现的高级语言的很多特性或者是功能在一定程度上应该是在C语言的开发中可以模拟的。正是如此,很多时候考虑诸如XXX是否可以用C语言实现的时候,应该无需考虑就能够给出一个肯定的答复。        关于参数可变函数实现其实还不是这种情况,但是让我想到的是“是否能够实现

小灰笔记 2184

c语言哪些函数参数个数可变,C语言实现参数个数可变函数

C语言实现参数个数可变函数导语:C语言实现参数个数可变函数:其实,我总觉得有个结论应该是必然的。既然很多语言最初都是由C语言发展来的,还有很多语言的基础是用C语言实现的。那么,这些用C语言实现的高级语言的很多特性或者是功能在一定程度上应该是在C语言的开发中可以模拟的。正是如此,很多时候考虑诸如XXX是否可以用C语言实现的时候,应该无需考虑就能够给出一个肯定的答复。关于参数可变函数实现其实还...

weixin_39618275的博客 193

C语言实现参数个数可变函数(转)

参考文档一:采用C语言编程的时候,函数中形式参数的数目通常是确定的,在调用时要依次给出与形式参数对应的所有实际参数。但在某些情况下希望函数参数个数可以根据需要确定。典型的例子有大家熟悉的函数printf()、scanf()和系统调用execl()等。那么它们是怎样实现的呢?   C编译器通常提供了一系列处理这

czf19840413的专栏 1182

c语言中printf函数参数个数可变实现原理

介绍printf传入参数个数可变的原理以及自己实现一个可变参数个数函数

m0_53229076的博客 760

C语言实现参数个数可变函数

以前一直不知道原来C语言也有参数个数可变函数。 1、采用ANSI标准形式时,参数个数可变函数的原型声明是:  type   funcname(type   para1,   type   para2,   ...)     ----   这种形式至少需要一个普通的形式参数,后面的省略号不表示省略,而是函数原型的一部分。type是函数返回值和形式参数的类型。 2、 采用与UN

wbs5812的专栏 446

C++...三个点用法 实现参数个数可变函数

C语言实现参数个数可变函数       采用C语言编程的时候,函数中形式参数的数目通常是确定的,在调用时要依次给出与形式参数对应的所有实际参数。但在某些情况下希望函数参数个数可以根据需要确定。典型的例子有大家熟悉的函数printf()、scanf()和系统调用execl()等  1、在win环境下编程例子:  以下例子在VS2010编译通过。 #include<stdio....

weixin_34342578的博客 1031

用C语言实现参数个数可变函数【转自中国程序员网】

         采用C语言编程的时候,函数中形式参数的数目通常是确定的,在调用时要依次给出与形式参数对应 的所有实际参数。但在某些情况下希望函数参数个数可以根据需要确定。典型的例子有大家熟悉的函数 printf()、scanf()和系统调用execl()等。那么它们是怎样实现的呢?   C编译器通常提供了一系列处理这种情况的宏,以屏蔽不同的硬件平台造成的差异,增加程序的可移 植性。这些宏包括v

大数据时代的狂欢 1036

不确定参数个数函数实现

某些情况下希望函数参数个数可以根据需要确定。典型的例子有大家熟悉的函数printf()、scanf()和系统调用execl()等。那么它们是怎样实现的呢?C编译器通常提供了一系列处理这种情况的宏,以屏蔽不同的硬件平台造成的差异,增加程序的可移植性。这些宏包括va_start、va_arg和va_end等。        ----   采用ANSI标准形式时,参数个数可变函数的原型声明

frankywu2008的专栏 2039

C语言怎样写参数个数可变的宏?

C语言怎样写参数个数可变的宏?

致力于分享在各类技术领域的学习与实践经验,涵盖编程、虚拟化、开源工具、网络安全等。 1141

从printf谈可变参数函数实现

作者:戎亚新 摘要:一直以来都觉得printf似乎是c语言库中功能最强大的函数之一,不仅因为它能格式化输出,更在于它的参数个数没有限制,要几个就给几个,来者不拒。printf这种对参数个数参数类型的强大适应性,让人产生了对它进行探索的浓厚兴趣。 关键字:printf, 可变参数 1. 使用情形 int a =10; double b = 20.0; char *str = "He

JoeBlackZQQ的专栏 621

C语言可变函数的原理与实现

本文介绍了C语言可变函数的原理与实现可变函数允许传递不同数量和类型的参数,常见的例子如printf函数实现可变函数需要先定义固定参数,再通过stdarg.h头文件中的va_list、va_start、va_arg和va_end宏来处理可变参数。通过这些工具,可以逐个取出并处理传入的可变参数。文章提供了一个计算可变整数平均值的例子,展示了可变函数的实际编写过程。

记录工作,记录生活 ;) 1029

转:从printf谈可变参数函数实现

原文作者:戎亚新 摘要:一直以来都觉得printf似乎是c语言库中功能最强大的函数之一,不仅因为它能格式化输出,更在于它的参数个数没有限制,要几个就给几个,来者不拒。printf这种对参数个数参数类型的强大适应性,让人产生了对它进行探索的浓厚兴趣。 关键字:printf, 可变参数 1. 使用情形 int a =10; double b = 20.0; char *str = ...

weixin_34236869的博客 339
上一篇: 在C程序中显示汉字
下一篇: 小程序
cmos
博客等级 码龄25年 0粉丝 9原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值