va_list实现不定参数C函数
来源:互联网 发布:德布劳内助攻数据 编辑:程序博客网 时间:2024/06/11 11:00
void vltest(int i, float k, ...){ va_list vl; //定义va_list变量vl,该变量是指向参数的指针 va_start(vl, k); // 参数一:va_list变量vl;参数二:va_list变量vl中最后一个固定参数 int j = va_arg(vl, int); // 参数一:va_list变量vl;参数二:可变参数的类型,返回值j即可变参数 double m = va_arg(vl, double); // 同上 unsigned long n = va_arg(vl, unsigned long); // 同上 va_end(vl); // 结束可变参数的获取 printf("i = %d, k = %.f, j = %d, m = %lf, n = %lu\r\n", i,k, j, m, n);}
上述方法不能智能识别不同参数的个数和类型。
如果想实现智能识别可变参数,比如printf,需要在自己的程序中作特殊处理,示例如下:
#include <stdarg.h> 2 3 void my_printf(const char* fmt, ... ) 4 { 5 va_list ap; 6 va_start(ap,fmt); /* 用最后一个具有参数的类型的参数去初始化ap */ 7 for (;*fmt;++fmt) 8 { 9 /* 如果不是控制字符 */10 if (*fmt!='%')11 {12 putchar(*fmt); /* 直接输出 */13 continue;14 }15 /* 如果是控制字符,查看下一字符 */16 ++fmt;17 if ('\0'==*fmt) /* 如果是结束符 */18 {19 assert(0); /* 这是一个错误 */20 break;21 }22 switch (*fmt)23 {24 case '%': /* 连续2个'%'输出1个'%' */25 putchar('%');26 break;27 case 'd': /* 按照int输出 */28 {29 /* 下一个参数是int,取出 */30 int i = va_arg(ap,int);31 printf("%d",i);32 }33 break;34 case 'c': /* 按照字符输出 */35 {36 /** 但是,下一个参数是char吗*/37 /* 可以这样取出吗? */38 char c = va_arg(ap,char);39 printf("%c",c);40 }41 break;43 }44 }45 va_end(ap); /* 释放ap—— 必须! 见相关链接*/46 }
在C语言中,调用一个不带原型声明的函数时:
调用者会对每个参数执行“默认实际参数提升(default argument promotions)”。
同时,对可变长参数列表超出最后一个有类型声明的形式参数之后的每一个实际参数,也将执行上述提升工作。
提升工作如下:
——float类型的实际参数将提升到double
——char、short和相应的signed、unsigned类型的实际参数提升到int
——如果int不能存储原值,则提升到unsigned int
然后,调用者将提升后的参数传递给被调用者。
因此,my_printf是绝对无法接收到上述类型的实际参数的。
上面的代码的38与39行,应该改为:
int c = va_arg(ap,int);printf("%c",c);
同理, 如果需要使用short和float, 也应该这样:
short s = (short)va_arg(ap,int);float f = (float)va_arg(ap,double);
总之,va_arg(ap,type)中的type绝对不能为以下类型:
——char、signed char、unsigned char
——short、unsigned short
——signed short、short int、signed short int、unsigned short int
——float
注:部分编译器,如笔者所测试的xCode4.3,输入上述错误类型后有警告提示。
阅读全文
0 0
- va_list实现不定参数C函数
- va_list实现不定参数C函数
- va_list实现不定参数C函数
- C语言不定长参数的实现 va_list
- C语言不定参数函数实现
- C语言不定参数函数的实现
- 不定参数函数实现
- 不定参数函数实现
- c++中参数不定函数和va_list的使用
- va_list,va_start,va_end处理不定参数函数调用不定参数函数的问题
- c 不定参数的函数
- c语言不定参数函数
- c/c++不定参数函数
- C/C++下不定参数的函数的实现
- c语言不定参数与printf函数的实现
- VC 不定参数函数 实现
- 不定参数函数的实现
- c函数va_list可变参数原理
- static知识小结
- Java 四种内部类
- 实现一个简单的 shared_ptr
- C++大全、C语言大全pdf,从C语言起源讲起!还有网盘链接!
- Vue组件开发实践
- va_list实现不定参数C函数
- Linux Shell高级技巧
- ros全局路径规划分享
- 企业自颁布服务器证书的有效性验证(C#为例)
- iPhone网络编程初体验
- 原码、反码、补码详解 及 >> 和 >>>的区别
- oracle latch _spin_count
- docker "no such file or directory"错误的一个解决方案
- Vue2.0之去掉组件click事件的native修饰