const char* fmt
2007-04-02 14:33
316 查看
- Linux 程序设计专题讨论 (http://www.linuxsir.org/bbs/forumdisplay.php?f=76)
- - 有些函数参数个数可变,例如printf,怎么实现? (http://www.linuxsir.org/bbs/showthread.php?t=214084)
如题 |
type va_arg(va_list ap, type); void va_end(va_list ap); void va_copy(va_list dest, va_list src); 具体说明请看man va_start。 |
实际上它主要是利用函数参数的内存空间连续性实现的。 比如int foo(int x,...) 如果调用时foo(1,2,3,4,5,6) 则在foo内部通过&x取得第一个参数的地址后,+4就是第二个参数的地址,这样就可以得到2,依此类推,所有参数就拿到了。 那么那些va_...的宏就是通过这种办法实现的。 |
|
|
void easy_printf(char* arg_types, ...){ va_list arg_list; int arg_int; char * arg_str; double arg_float; char * cur_type; cur_type = arg_types; va_start(arg_list,arg_types); while('/0' != *cur_type){ switch(*cur_type){ case 'i': arg_int = va_arg(arg_list,int); cerr << arg_int; break; case 'f': arg_float = va_arg(arg_list,double); cerr << arg_float; break; case 's': arg_str = va_arg(arg_list,char*); cerr << arg_str; break; default: break; } cur_type++; } va_end(arg_list); cerr << endl; } 一个小例子。使用的时候,easy_printf("sss", "ok", "u", "right"); 通过第一个参数“sss”知道后面还有三个参数。 |
|
所有时间均为[北京时间]。现在的时间是 14:28。 |
版权所有 ©2000 - 2007, Jelsoft Enterprises Ltd.
官方中文技术支持: vBulletin 中文
版权所有 ©2000 - 2005, Jelsoft Enterprises Ltd.
相关文章推荐
- void panic(const char *fmt, ...)
- int printf(const char* fmt,...)
- int printf(const char* fmt,...)
- 不存在从CString到const char*的转换
- char str[], const char str[], const char *str区别
- 关于 不能从const char *转换为LPCWSTR
- const char*, char const* and char *const 的区别
- void Uart_Printf(char *fmt,...)
- 怎样记忆const char*, char const*, char* const的区别
- 老调重弹:const char*, char const* and char *const
- const char*, char const*, char*const的区别
- 关于const char*, char const* and char *const 等的区别
- const char * and char * const
- UNICODE 工程下 CSTRING 转 CONST CHAR* 的最简便方法 VS2005 VS2008
- char *strtok(char *s, const char *delim) 用法
- char * /const char */unsigned char * 转换
- CString const char*与char*之间的转换关系
- string 与char* 、char[]、const char*之间的转换
- 你知道吗:char **p 和 const char **p 类型不相容
- string, const char*,char*, 及char[]