`
阅读更多
不定参数函数
stdarg.h是C语言中C标准函数库的头文件,stdarg是由stdandard(标准) arguments(参数)简化而来,主要目的为让函数能够接收不定量参数。 C++的cstdarg头文件中也提供这样的机能;虽然与C的头文件是兼容的,但是也有冲突存在。
不定参数函数(Variadic functions)是stdarg.h内容典型的应用,虽然也可以使用在其他由不定参数函数调用的函数(例如,vprintf)。

声明不定参数函数
不定参数函数的参数数量是可变动的,它使用省略号来忽略之后的参数。例如printf函数一般。代表性的声明为:
int check(int a, double b, ...);
不定参数函数最少要有一个命名的参数,所以
char *wrong(...);
在C是不被允许的(在C++中,这样的声明是合理的)。在C,省略符号之前必须要有逗号;在C++,则没有这种强制要求。

定义不定参数函数
使用相同的语法来定义:
long func(char, double, int, ...);
 
long func(char a, double b, int c, ...)
{
    /* ... */
}
在旧形式可能会出现较省略的函数定义:
long func();
 
long func(a, b, c, ...)
    char a;
    double b;
{
    /* ... */
}

访问参数
访问未命名的参数,首先必须在不定参数函数中声明va_list型态的变数。调用va_start并传入两个参数:第一个参数为va_list型态的变数,第二个为函数最后一个参数的名称,接着每一调用va_arg就会回传下一个参数,va_arg的第一个参数为va_list,第二个参数为回传的型态。最后va_end必须在函数回传前被va_list呼叫(當作參數)。(沒有要求要讀取完所有參數)
C99提供額外的巨集,va_copy,它能够复制va_list。而va_copy(va2, va1)意思为拷贝va1到va2。
没有机制定义该怎么判别传递到函数的参数量或者型态。函数通常需要知道或确定它们变化的方法。共通的惯例包含:
使用printf或scanf类的格式化字符串来嵌入明确指定的型态。
在不定参数最后的标兵值(sentinel value)。
总数变数来指明不定参数的数量.  


类型安全性
有些C工具将C扩充允许编译器检查适当格式化字符串及标兵(sentinels)的使用。如果没有这个扩充,编译器通常无从检查传入函数的未命名参数是否为所预期的型态。因此,必须对点做出谨慎的正确性确认,型态没有吻合为未定义行为(Undefined behavior)。举个例,如果传入NULL指针,首先就是不能写入对应到适当指针型态但纯粹NULL的指针。再者考虑默认参数应用到未命名参数。float将会自动的被转换成double‧同样的比int(整数)更小容量的参数型态将会被转换成int或者unsigned int‧函数所接收到的未命名参数必须预期到会被转换型态。

例子
#include <stdarg.h>
#include <stdio.h>

int sum(int n,...)
{
int sum = 0;
va_list arg_ptr;
va_start(arg_ptr,n);
for(;n;--n)
{
sum = sum + va_arg(arg_ptr,int);
}
        va_end(arg_ptr);

 

return sum;
}

int main(int argc,const char* argv[])
{
printf("sum: %i\n",sum(3,1,2,3));
return 0;
}
分享到:
评论

相关推荐

    C/C++语言可变参数函数的参数传递机制剖析.pdf

    总结来说,C/C++语言的可变参数函数参数传递机制主要基于栈内存的使用以及一些特定的宏处理,其中C语言使用va_list宏系列,而C++则提供模板和折叠表达式来实现类似的功能。理解这些机制对于深入学习C/C++的底层细节...

    C/C++多参数函数参数的计算顺序与压栈顺序的示例代码

    同时,对于可变参数函数的理解也是编写高效和安全代码的关键。其他相关主题,如构造函数的默认参数、函数重载、引用作为函数参数等,也是C++程序员需要掌握的基础技能。在编写C++代码时,应遵循最佳实践,确保代码在...

    不定参数函数2.pdf

    不定参数函数是C/C++语言中一类特殊的函数,它们允许函数接收不确定数量的参数。在C/C++标准库中,这种类型的函数并不多见,但以printf()和scanf()系列函数为代表的输入输出函数以及exec*()系列函数执行外部程序时...

    不定参数函数1.pdf

    在编程中,不定参数函数是一种特殊的函数,其参数个数是不确定的。这类函数在C或C++语言中广泛应用于需要传递不确定数量参数的场景。为了编写这样的函数,需要使用一种特殊的机制来处理可变数量的参数。在C语言中,...

    不定参数函数

    不定参数函数是编程语言中的一种特性,允许我们定义可以接受任意数量参数的函数。这种功能在处理各种场景时非常有用,比如需要一个函数能够灵活地处理任意数量的输入数据,或者在不知道具体参数数量的情况下创建通用...

    C++/C编程规范

    - **参数规则**:完整写出参数及其类型,合理命名,避免过多参数,使用`const`修饰只读指针,避免不定参数。 - **返回值规则**:明确返回值类型,返回值与函数名相符,不混杂正常值和错误标志,有时为灵活性考虑可...

    C++,C头文件汇总

    * `&lt;cstdarg&gt;`:不定参数列表支持 * `&lt;cstddef&gt;`:常用常量 * `&lt;cstdio&gt;`:定义输入/输出函数 * `&lt;cstdlib&gt;`:定义杂项函数及内存分配函数 * `&lt;cstring&gt;`:字符串处理 * `&lt;ctime&gt;`:定义关于时间的函数 * `&lt;cwchar&gt;`...

    优质的C++后端开发进阶学习资料

    不定参数函数实现var_arg系列的宏 你一定要搞明白的C函数调用方式与栈原理 深入理解C/C++中的指针 详解C++11中的智能指针 C++17结构化绑定 C++必须掌握的pimpl惯用法 用Visual Studio调试Linux程序 如何使用Visual ...

    嵌入式C C++语言精华

    C/C++的可变参数表允许函数接受数量不定的参数,这在实现日志打印、错误报告等函数时非常有用。然而,使用可变参数表需要谨慎,因为它可能导致类型安全问题和性能开销。 对于数组名和指针的区别,它们在C/C++中虽然...

    c语言va函数讲解.

    C语言中的va函数,也就是可变参数函数(variable argument function),允许函数接收不定数量的参数,这种机制为函数调用提供了极大的灵活性。在C/C++标准库中,printf()和scanf()系列函数就是典型的可变参数函数,...

    嵌入式C C++语言精华.pdf

    C/C++的`va_list`、`va_start`、`va_end`等宏提供了一种机制,用于处理可变数量的参数列表,增强了函数的灵活性。 #### 五、C/C++数组名与指针的区别 数组名在大多数情况下可视为指向数组首元素的指针,但在某些上...

    C,C++经典推荐博文汇总

    C语言支持可变参数列表,通过`stdarg.h`头文件中的宏和函数,可以处理不定数量的参数。掌握变参函数的编写和调用规则,对于编写灵活的函数接口非常有用。 #### 浅谈Unix和Linux下的int 在Unix和Linux环境下,`int`...

    嵌入式C_C++语言精华.pdf

    C/C++ 支持可变参数函数,即函数可以接受数量不定的参数。这种特性在某些情况下非常有用,例如实现日志记录功能。 - **标准库函数**:`printf` 和 `va_list` 等函数和类型为处理可变参数提供了支持。 - **实现方法*...

    C++可变参数的函数与模板实例分析

    本文实例展示了C++可变参数的函数与模板的实现方法,有助于大家更好的理解可变参数的函数与模板的应用,具体...一、可变参数函数 1、initializer_list形参 如果函数的实参数量未知但是全部实参的类型都相同,我们可以

    不定参数在C语言中的应用实例

    不定参数在C语言中的应用实例:不定参数当年做为C/C++语言一个特长被很多人推崇,但是实际上这种技术并没有应用很多。除了格式化输出之外,我实在没看到多少应用。主要原因是这种技术比较麻烦,副作用也比较多,而...

    关于C/C++中可变参数的详细介绍(va_list,va_start,va_arg,va_end)

    在C/C++编程中,可变参数是一种处理不定数量参数的方法。这主要通过一组预定义的宏来实现,包括`va_list`、`va_start`、`va_arg`和`va_end`,这些宏定义在`stdarg.h`头文件中。下面我们将详细探讨这些宏的用途和工作...

Global site tag (gtag.js) - Google Analytics