写可变参数的C函数,需要在程序中用到以下这些宏:
void va_start( va_list arg_ptr, prev_param );
type va_arg( va_list arg_ptr, type );
void va_end( va_list arg_ptr );
va 是 variable argument( 可变参数 )的意思,如前所述,这些宏定义在stdarg.h中,所以用到可变参数的程序应该包括这个头文件。
下面为一个简单例子,该函数至少有一个整参,第二个参数也是整型的,但可选。
void va_fun(int i, ...)
{
va_list arg_ptr;
int j=0;
va_start(arg_ptr, i);
j=va_arg(arg_ptr, int);
va_end(arg_ptr);
printf("%d %d\n", i, j);
return;
}
这样在程序中就可以调用函数:
va_fun( 100 );
va_fun( 100, 200 );
我们使用可变参数的步骤如下:
1)首先在函数里定义一个va_list型的变量,这里是arg_ptr,这个变
量是指向参数的指针;
2)然后用va_start宏初始化变量arg_ptr,这个宏的第二个参数是第
一个可变参数的前一个参数,是一个固定的参数;
3)然后用va_arg返回可变的参数,并赋值给整数j. va_arg的第二个
参数是你要返回的参数的类型,这里是int型;
4)最后用va_end宏结束可变参数的获取.然后你就可以在函数里使
用第二个参数了.如果函数有多个可变参数的,依次调用va_arg获
取各个参数。
如果我们用下面三种方法调用的话,都是合法的,但结果却不一样:
(1)va_fun(100);
结果是:100 -123456789(会变的值)
(2)va_fun(100,200);
结果是:100 200
(3)va_fun(100,200,300);
结果是:100 200
我们看到第一种调用有错误,第二种调用正确,第三种调用尽管结果
正确,但和我们函数最初的设计有冲突.在下面一节我们探讨出现这些结果
的原因和可变参数在编译器中是如何处理的.
文章评论(0条评论)
登录后参与讨论