C语言中不定参数函数的使用
2013-03-27 13:30
309 查看
由于在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 ) // 将指针置为无效
下面程序的可选参数的结束标志设置为可选参数参数小于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 ) // 将指针置为无效
#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; }
//程序输出结果为0 1 3
/* main调用test函数堆栈的分布如下图: 地址: 高 ............... | ............... | 第二个可选的参数 | 第一个可选的参数 | j | i 低 test的返回地址 */
相关文章推荐
- C语言不定参数个数,可变参数函数使用学习
- C语言中不定参数函数的使用
- 用指针处理C语言中不定数目的函数参数[转]
- 深入了解C语言(函数的参数传递和函数使用参数的方法)
- c语言指针做函数参数,使用指针地址(二级指针)在被调函数中修改主调函数的指针。
- C语言可变参数函数的使用技巧(转)
- C语言:可变参数的函数(VA使用说明)
- C语言 编写一个函数reverse_string(char * string) 实现:将参数字符串中的字符反向排列。 要求:不能使用C函数库中的字符串操作函数。
- C语言不定参数函数实现
- 【C语言】编写一个函数reverse_string(char * string)(递归实现),将参数字符串中的字符反向排列,不能使用C函数库中的字符串操作函数。
- C语言如何在可变参数函数中使用printf?
- c语言不定参数的使用
- c语言不定参数函数
- C语言可变参数函数及三个宏va_start、va_arg和va_end的使用
- 深入了解C语言(函数的参数传递和函数使用参数的方法)
- [置顶] 函数传递不定参数理解-c语言
- 【c语言】编写一个函数reverse_string(char * string) 实现:将参数字符串中的字符反向排列。 要求:不能使用C函数库中的字符串操作函数
- C语言中数组作为函数的参数以及返回值的使用简单入门
- C语言getopt()函数的使用及参数
- C语言深入浅出可变参数函数的使用技巧