const char* fmt
来源:互联网 发布:mac os x 10.12.6 iso 编辑:程序博客网 时间:2024/05/12 13:24
LinuxSir.Org (http://www.linuxsir.org/bbs/index.php)
- Linux 程序设计专题讨论 (http://www.linuxsir.org/bbs/forumdisplay.php?f=76)
- - 有些函数参数个数可变,例如printf,怎么实现? (http://www.linuxsir.org/bbs/showthread.php?t=214084)
netjune 05-08-15 18:08
有些函数参数个数可变,例如printf,怎么实现?
如题
masterdemon 05-08-15 18:27
void va_start(va_list ap, last);
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。
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。
弥敦路九号 05-08-16 09:42
va_xxx 在VC中表现为宏。
实际上它主要是利用函数参数的内存空间连续性实现的。
比如int foo(int x,...)
如果调用时foo(1,2,3,4,5,6)
则在foo内部通过&x取得第一个参数的地址后,+4就是第二个参数的地址,这样就可以得到2,依此类推,所有参数就拿到了。
那么那些va_...的宏就是通过这种办法实现的。
实际上它主要是利用函数参数的内存空间连续性实现的。
比如int foo(int x,...)
如果调用时foo(1,2,3,4,5,6)
则在foo内部通过&x取得第一个参数的地址后,+4就是第二个参数的地址,这样就可以得到2,依此类推,所有参数就拿到了。
那么那些va_...的宏就是通过这种办法实现的。
lollipop 05-08-16 09:52
参数的个数怎么传递?
rickxbx 05-08-16 10:11
如果是printf这样的,是不需要传递参数个数的,她是根据第一个参数(即那个format字符串)决定从栈里拿多少参数(正因为这样,所以才会有printf溢出问题的存在)
francxz 05-08-17 05:13
引用:
作者: lollipop
参数的个数怎么传递?
代码:
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”知道后面还有三个参数。
netjune 05-08-17 10:57
详细看了,,很巧妙阿
所有时间均为[北京时间]。现在的时间是 14:28。
Powered by vBulletin 版本 3.5.4
版权所有 ©2000 - 2007, Jelsoft Enterprises Ltd.
官方中文技术支持: vBulletin 中文
版权所有 ©2000 - 2005, Jelsoft Enterprises Ltd.
- const char* fmt
- void panic(const char *fmt, ...)
- int printf(const char* fmt,...)
- int printf(const char* fmt,...)
- void Uart_Printf(char *fmt,...)
- void Uart_Printf(char *fmt,...)
- void OutputDebugStringf(char *fmt, ...)
- void Uart_Printf(char *fmt,...)
- void u3_printf(char* fmt,...)
- void Uart_Printf(char *fmt,...)
- void Uart_Printf(char *fmt,...)
- 解决unable to find string literal operator 'operator""fmt' with 'const char [15]', 编译问题
- const char & char const
- const char* char*const
- const char*,char *const,const char*const
- const char*,char *const,const char*const
- void Uart_Printf(char *fmt,...) 解释
- const char*, char const* and char *const
- UltraEdit-32 的PL/SQL语法加亮样式
- 金山毒霸 2007 杀毒套装 免费升级破解版
- [350款精品绿色软件][rar][自己淘吧肯定有你感兴趣的]
- 透明WEB代理 让你管理内部上网内容 轻松自如
- web-proxy环境下限速的应用
- const char* fmt
- 终于研究完tiOPF的文档了
- 关于局域网内的域名访问
- 高危险ANI鼠标指针漏洞非官方免疫补丁
- DBMS_LOB包使用和维护
- Windows API 函数学习(8)---处理文本和字体
- 大话西游经典台词
- 谈办公自动化里的报表统计1——最基本的数据统计
- VC动态调用DLL