Web blog of yydzero
姚延栋(Yandong Yao)的博客
归档
« 十一月 2009
星期日星期一星期二星期三星期四星期五星期六
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
     
       
今天
Click me to subscribe
Search In My Blog

链接
 

今日点击: 101

Locations of visitors to this page
« One tips using rolle... | Main | C tips from daily... »
星期二 七月 04, 2006
C语言中可变长参数的处理

如何写可变参数函数

void va_start(va_list pvar, name): 根据name参数获得可变参数的指针 pvar。
(type *) va_arg(va_list pvar, type): 获得下一个可变参数,需要指定参数的类型。
void va_end(va_list pvar): 结束使用可变参数,使它不再指向内存有效地址。

例如:
void simple_va_func (int i, ...)
{
    va_list arg_ptr;
    int j = 0;

    va_start (arg_ptr, i);
    //这里的arg_ptr可以传递给任意函数作为参数,在那个函数内需要使用va_* 宏去获得对应的参数。
    j = va_arg (arg_ptr, int); 
    va_end (arg_ptr);

    return;
}

如何实现可变参数

可变参数的实现与具体的编译器/硬件平台相关,我们这里简单看一下 cdecl calling convention 下的参数传递。

cdecl模式下参数从右向左压入堆栈,而且是由调用者来做这个操作。
                          
                                               内存高地址(x86平台)
+-----------------------------+
| 最后一个可变参数     |
+-----------------------------+
| 倒数第二个可变参数 |
+-----------------------------+
|          ......                      |
+-----------------------------+
| 第一个可变参数         |      va_start 之后,arg_ptr 指向这里
+-----------------------------+
| 最后一个固定参数     |      这个参数的名字需要传递给va_start
+-----------------------------+
|          ......                      |
+-----------------------------+
| 第一个参数                 |
+-----------------------------+
| 函数返回地址             |
+-----------------------------+
| 调用者的 BP               |     被调用函数的栈基址
+-----------------------------+
| 局部变量                     |
+-----------------------------+

注意事项

参考

C语言中可变参数的用法
水滴石穿C语言之可变参数问题
CSDN C/C++电子杂志第一期 之 可变参数学习笔记
Posted at 08:55下午 七月 04, 2006 by Yaodong Zero Yao in C&C++  |  评论[0]

评论:

发表一条评论:
  • HTML语法: 禁用