C可变参数用法以及自己的Message()函数
2012-08-09 17:25
405 查看
首先,关于可变参数,实际上,也就是未知参数个数,在调用的时候再解析。我的理解是C总会把参数放到函数堆栈,那么,虽然声明函数 的时候不知道参数个数,但可以在使用时指明,并根据指出的参数进行解析,操作。
解析这种参数使用va_list宏,用法如下:
1. 声明va_list,
2. 使用va_start()取得参数"..."地址
3. 使用va_arg()取得下一参数地址 4. 使用va_end()结束解析
如
va_list args; //声明变量
va_start(args, before); //开始解析。args指向before后面的参数
参数类型 var=va_arg(args, 参数类型);//取下一个参数并返回。args指向下一个参数
va_end(args);
完全可以自己写format,并且解析"...",自己写出类似printf的函数,不过目前我不需要如此高端,下面是利用可变参数的一个简单例子,仅仅对需要打印的message做一下标记,并且可以留作以后修改(而不需要对所有代码修改)(比如,想改变格式,想改变打印方式,不在屏幕打印,而是用callback或者log到文件,等等)
我经常用到的例子:
用法:
解析这种参数使用va_list宏,用法如下:
1. 声明va_list,
2. 使用va_start()取得参数"..."地址
3. 使用va_arg()取得下一参数地址 4. 使用va_end()结束解析
如
va_list args; //声明变量
va_start(args, before); //开始解析。args指向before后面的参数
参数类型 var=va_arg(args, 参数类型);//取下一个参数并返回。args指向下一个参数
va_end(args);
完全可以自己写format,并且解析"...",自己写出类似printf的函数,不过目前我不需要如此高端,下面是利用可变参数的一个简单例子,仅仅对需要打印的message做一下标记,并且可以留作以后修改(而不需要对所有代码修改)(比如,想改变格式,想改变打印方式,不在屏幕打印,而是用callback或者log到文件,等等)
int Error( const char *format, ... ) { va_list ap; int retval; va_start(ap,format); printf("[ERROR] "); retval = vprintf(format,ap); printf("\n"); va_end(ap); return retval; }
我经常用到的例子:
void TRACE(LPCSTR szFormat, ...) { CHAR szBuffer[1024]; va_list pArgs; va_start(pArgs, szFormat); vsprintf(szBuffer, szFormat, pArgs); va_end(pArgs); OutputDebugString(szBuffer); }
用法:
TRACE(" CKM_DES_ECB mech->ulParameterLen %d",mech->ulParameterLen);
TRACE("enter encr_mgr_encrypt_update\n");
相关文章推荐
- python函数参数是值传递还是引用传递(以及变量间复制后是否保持一致):取决于对象内容可变不可变
- C#关于静态函数与普通函数之间的调用问题,以及可变参数的使用
- C++可变参数函数( 如:void Func(int a, int b, ...) )用法
- Python中函数的参数定义和可变参数用法实例分析
- 基础快速过 之C语言 三:函数之快速运用~~[函数的用法,参数概念,自己写的函数,变量和常量的用法]
- 可变参数列表的剖析以及printf函数的实现
- C++...三个点用法 实现参数个数可变的函数
- Jquery自定义一个带名称的、可以传参数的函数以及setTimeout延迟调用,用法详解
- 可变参数模拟printf()函数实现一个my_print()函数以及调用可变参数需注意的陷阱
- C语言中va(可变函数参数) 的另一种用法与危险事项
- 函数可变参数列简单用法
- C 语言可变参数函数原理及用法
- PHP5.6新增加的可变函数参数用法分析
- JavaScript Arguments 实现可变参数的函数,以及函数的递归调用
- python 函数传递可变参数的用法
- 自己写的仿fprintf()函数和可变参数函数浅析
- 生成器+列表生成式,生成器可以节省内存,随时调取函数运行,以及实现多线程运行函数,__next__()和.send(参数)的区别,a,b=b,a+b其实是元祖的用法,出现异常状态用try...except StopIteration来处理
- 编写适合自己需要的printf()函数 -- 可变参数
- c语言基于stdarg.h的可变参数函数的用法
- Python中函数的参数定义和可变参数用法实例分析