"); //-->
文章导读:我们在C语言编程中会遇到一些参数个数可变的函数,例如printf()这个函数,它的定义是这样的:
int printf( const char* format, ...);
它除了有一个参数format固定以外,后面跟的参数的个数和类型是可变的,例如我们可以有以下不同的调用方法:
printf("%d",i);
printf("%s",s);
printf("the number is %d ,string is:%s", i, s);
究竟如何写可变参数的C函数以及这些可变参数的函数编译器是如何实现的呢?本文就这个问题进行一些探讨,希望能对大家有些帮助.会C++的网友知道这些问题在C++里不存在,因为C++具有多态性.但C++是C的一个超集,以下的技术也可以用于C++的程序中.限于本人的水平,文中如果有不当之处,请大家指正.
int printf( const char* format, ...);
printf("%d",i);
printf("%s",s);
printf("the number is %d ,string is:%s", i, s);
究竟如何写可变参数的C函数以及这些可变参数的函数编译器是如何实现的呢?本文就这个问题进行一些探讨,希望能对大家有些帮助.会C++的网友知道这些问题在C++里不存在,因为C++具有多态性.但C++是C的一个超集,以下的技术也可以用于C++的程序中.限于本人的水平,文中如果有不当之处,请大家指正.
(一)写一个简单的可变参数的C函数
下面我们来探讨如何写一个简单的可变参数的C函数.写可变参数的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 );
void simple_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;
}
extern void simple_va_fun(int i, ...);
simple_va_fun(100);
simple_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)
simple_va_fun(100);
simple_va_fun(100,200);
simple_va_fun(100,200,300);
typedef char * va_list;
#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)) )
#define va_end(ap) ( ap = (va_list)0 )
j= ( *(int*)((ap += _INTSIZEOF(int))-_INTSIZEOF(int)) );
void simple_va_fun(int i, ...)
{
va_list arg_ptr;
char *s=NULL;
va_start(arg_ptr, i);
s=va_arg(arg_ptr, char*);
va_end(arg_ptr);
printf("%d %s\n", i, s);
return;
}
va_start(va_list arg_ptr);
va_start(va_list arg_ptr, prev_param);
专栏文章内容及配图由作者撰写发布,仅供工程师学习之用,如有侵权或者其他违规问题,请联系本站处理。 联系我们
相关推荐
Virtex-5 FPGA ML501评估平台电路图(5)
超高频RFID IC封装
Virtex-5 FPGA ML501评估平台电路图(6)
Virtex-5 FPGA ML501评估平台电路图(7)
SX系列通信控制器
SPCE061A为核心TCPIP协议实现(C原代码)
用vmware的硬盘启动出现的问题
批英特尔外移害失势 特朗普:若当初课高关税就不会跑去中国台湾
TI RFID概述(上海)(下)
苹果首款折叠手机定于2026年发布,铰链供应商竞争加剧
菜鸟一问关于Vxworks下安装网卡驱动
软硬结合板(刚柔板)设计规范
专为客户设计的高性能器件系列
未来工厂:搭载人工智能的边缘传感器设计——第1部分
莱迪思将举办关于最新小型、低功耗FPGA创新的网络研讨会
超低功率高性能新一代产品MSP430F5xx
UHF FMorFSK无线接收芯片CMX018的原理及应用
美国将收购英特尔10%股份,但晶圆厂的未来仍取决于客户需求
谷歌硬件布局:AI 成焦点,翻转式折叠屏和平板电脑暂缓
我来了
TI RFID概述(上海)(上)
TCPIP通讯中的端口分类
塔克热系统在中国光博会隆重推出高性能光电应用中的最新主动制冷技术
Virtex-5 FPGA ML501评估平台电路图(8)
思创嵌入式系统开发能力培训招生简章
传输线回流路径
Virtex-5 FPGA ML501评估平台电路图(4)
专为AI PC应用打造,格科推出高性能图像传感器GC5605
vxworks下做usb的请进
TMS320F24x与PC机串行通信接口设计