stdarg.h
来源:互联网 发布:mac 上qq 上不了网 编辑:程序博客网 时间:2024/06/10 06:03
目录
- 简介
- 可变参数函数
- 成员
- 访问参数
- 类型安全性
- 例子
- varargs.h
编辑本段简介
stdarg.h是C语言中C标准函数库的头文件,stdarg是由standard(标准) arguments(参数)简化而来,主要目的为让函数能够接收可变参数。[1]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, ...) { /* ... */ } 在C的旧形式中可能会出现较省略的函数定义: long func(); char a; double b; long func(a, b, c, ...) { /* ... */ }编辑本段成员
stdarg.h数据类型
类型名称描述相容va_list用来保存宏va_arg与宏va_end所需信息C89stdarg.h宏
巨集名称描述相容va_start使va_list指向起始的参数C89va_arg检索参数C89va_end释放va_listC89va_copy拷贝va_list的内容C99编辑本段访问参数
访问未命名的参数,首先必须在可变参数函数中声明va_list类型的变量。调用va_start并传入两个参数:第一个参数为va_list类型的变量,第二个为省略号前最后一个有名字的参数的名称,接着每一调用va_arg就会返回下一个参数,va_arg的第一个参数为va_list,第二个参数为返回的类型。最后va_end必须在函数返回前被va_list调用(va_list当作参数)(没有要求要读取完所有参数)。 C99提供额外的宏,va_copy,它能够复制va_list。而va_copy(va2, va1)函数作用为拷贝va1到va2。 没有机制定义该怎么判别传递到函数的参数量或者数据类型。函数通常需要知道或确定它们变化的方法。共通的惯例包含: 使用printf或scanf类的格式化字串来嵌入明确指定的类型。 在可变参数最后的标记值(sentinel value)。 总数变量来指明可变参数的数量。编辑本段类型安全性
有些C实现提供了对可变参数的扩展,允许编译器检查适当的格式化字串及标志(sentinels)的使用。如果没有这个扩充,编译器通常无从检查传入函数的未命名参数是否为所预期的类型。因此,必须小心谨慎以确保正确性,因为不匹配的数据类型将导致未定义行为(Undefined behavior)。例如,如果传递空指针,不能仅仅写入NULL(可能实际定义为0),还要转化为适当的指针类型。另一个考虑是未命名参数的默认的类型提升。float将会自动的被转换成double。同样的,比int(整数)更小容量的参数数据类型将会被转换成int或者unsigned int。函数所接收到的未命名参数必须提前考虑将会出现的数据类型提升。编辑本段例子
#include <stdio.h> #include <stdarg.h> void printargs(int arg1, ...) /* 输出所有int类型的参数,直到-1结束 */ { va_list ap; int i; va_start(ap, arg1); for (i = arg1; i != -1; i = va_arg(ap, int)) printf("%d ", i); va_end(ap); putchar('\n'); } int main(void) { printargs(5, 2, 14, 84, 97, 15, 24, 48, -1); printargs(84, 51, -1); printargs(-1); printargs(1, -1); return 0; } 这个程序产生输出: 5 2 14 84 97 15 24 48 84 51 1编辑本段varargs.h
POSIX定义所遗留下的头文件varargs.h,它早在C标准化前就已经开始使用了且提供类似stdarg.h的功能。MSDN明确指出这一头文件已经过时,完全被stdarg.h取代。这个头文件不属于ISO C的一部分。文件定义在单一UNIX规范的第二个版本中。 由于varargs.h不属于标准C,所以不对其详细说明。- stdarg.h
- stdarg.h
- STDARG.H
- stdarg.h
- stdarg.h
- stdarg.h
- stdarg.h
- stdarg.h 简介
- stdarg.h用法小记
- stdarg.h详解
- #include <stdarg.h>
- stdarg.h简介
- stdarg.h+vfprintf+abort
- c library-stdarg.h
- 关于stdarg.h
- stdarg.h详解
- stdarg.h详解
- stdarg.h详解
- hdu1753大明A+B
- 二维数组与指针
- ios协议和委托
- tableModel 和 Adapter
- Android开发图书推荐
- stdarg.h
- 笔记:Cookie与Session的使用与区别
- 不知道还要心痛多久_伤感的情绪日志
- hdu 1022 Train Problem I <stack>
- 题目2:括号配对
- 快速幂
- boost library usage
- CListCtrl虚拟列表技术
- hdu 3746 Cyclic Nacklace