原创 C语言,可变参数(2)

2015-9-12 14:27 778 5 5 分类: MCU/ 嵌入式 文集: STM32

写可变参数的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 


我们看到第一种调用有错误,第二种调用正确,第三种调用尽管结果 
正确,但和我们函数最初的设计有冲突.在下面一节我们探讨出现这些结果 
的原因和可变参数在编译器中是如何处理的.

 

 

 

 

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
5
关闭 站长推荐上一条 /3 下一条