当前位置:编程学习 > C/C++ >>

C语言中不定参数函数的使用

由于在C语言中没有函数重载,解决不定数目函数参数问题变得比较麻烦。C语言中实现不定参数函数的问题是利用调用函数时使用的堆栈来解决。原理是通过堆栈读取可选参数的值,直到读取到所设定的结束标志为止。 下面程序的可选参数的结束标志设置为可选参数参数小于0。


在VC++6.0的include有一个stdarg.h头文件,有如下几个宏定义:
#define _INTSIZEOF(n) ((sizeof(n)+sizeof(int)-1)&~(sizeof(int) - 1) )
#define va_start(ap,v) ( ap = (va_list)&v + _INTSIZEOF(v) )                   //第一个可选参数地址
#define va_arg(ap,t) ( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) )     //返回ap地址处的值,同时ap指向下一个可选参数的地址
#define va_end(ap) ( ap = (va_list)0 )                                                       // 将指针置为无效
[cpp]
#include "stdafx.h"  
#include "stdarg.h"  
void test(int i,int j, ...) 

    int data; 
    va_list args;                                   //定义va_list变量  
    printf("%d %d", i, j); 
    va_start(args,j);                               //使args指向j后的第一个可选参数  
    while((data = va_arg(args,int)) >= 0)             //va_arg函数返回参数args指针所对应的变量值,同时args指向下个可选参<SPAN style="WHITE-SPACE: pre">                               </SPAN>// 数. 参数大于或者等于0时,读取数据,同时把读取的数据打印出来。当读<SPAN style="WHITE-SPACE: pre">                         </SPAN>         //到小于0的参数时,结束循环。  
            printf(" %d", data); 
    printf("\n"); 
    va_end(args);                            //使args指针无效  
     

 
 
int main(int argc, char* argv[]) 

    test(0, 1 , 3, -1); 
    return 0; 

#include "stdafx.h"
#include "stdarg.h"
void test(int i,int j, ...)
{
 int data;
 va_list args;         //定义va_list变量
 printf("%d %d", i, j);
 va_start(args,j);        //使args指向j后的第一个可选参数
 while((data = va_arg(args,int)) >= 0)    //va_arg函数返回参数args指针所对应的变量值,同时args指向下个可选参        // 数. 参数大于或者等于0时,读取数据,同时把读取的数据打印出来。当读                //到小于0的参数时,结束循环。
   printf(" %d", data);
 printf("\n");
 va_end(args);                            //使args指针无效
 
}


int main(int argc, char* argv[])
{
 test(0, 1 , 3, -1);
 return 0;
}[cpp] view plaincopyprint?//程序输出结果为0 1 3 

//程序输出结果为0 1 3[cpp] view plaincopyprint?/*
main调用test函数堆栈的分布如下图:
 
  地址:   高  ...............  
            |   ...............
            |   第二个可选的参数
            |   第一个可选的参数
            |   j
            |   i
            低  test的返回地址
 
*/ 

/*
main调用test函数堆栈的分布如下图:

  地址: 高  ............... 
   |   ...............
   | 第二个可选的参数
     | 第一个可选的参数
     | j
   | i
   低  test的返回地址

*/

 


分享到:

补充:软件开发 , C语言 ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,