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)
有些函数参数个数可变,例如printf,怎么实现?
如题
|
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。 |
va_xxx 在VC中表现为宏。
实际上它主要是利用函数参数的内存空间连续性实现的。 比如int foo(int x,...) 如果调用时foo(1,2,3,4,5,6) 则在foo内部通过&x取得第一个参数的地址后,+4就是第二个参数的地址,这样就可以得到2,依此类推,所有参数就拿到了。 那么那些va_...的宏就是通过这种办法实现的。 |
参数的个数怎么传递?
|
如果是printf这样的,是不需要传递参数个数的,她是根据第一个参数(即那个format字符串)决定从栈里拿多少参数(正因为这样,所以才会有printf溢出问题的存在)
|
引用:
代码:
void easy_printf(char* arg_types, ...){
一个小例子。使用的时候,easy_printf("sss", "ok", "u", "right"); 通过第一个参数“sss”知道后面还有三个参数。 |
详细看了,,很巧妙阿
|
所有时间均为[北京时间]。现在的时间是 14:28。 |
Powered by vBulletin 版本 3.5.4
版权所有 ©2000 - 2007, Jelsoft Enterprises Ltd.
官方中文技术支持: vBulletin 中文
版权所有 ©2000 - 2005, Jelsoft Enterprises Ltd.