1、在函数中一般都是固定的参数调用,为了实现可变参数调用,需要用到stdarg.h库中声明的几个宏定义。
2、定义
在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)) ) //下一个参数地址
#define va_end(ap) ( ap = (va_list)0 ) // 将指针置为无效
3、可变参数函数的实现
#include <stdio.h>
#include <stdarg.h>
#include <iostream>
using namespace std;
void UartPrintf(char *fmt,...)
{
char buffer[80];
char cnt;
va_list argptr; //定义va_list类型的指针
va_start(argptr,fmt); //获取第一个可选参数地址,即fmt后面的一个参数
vsprintf(buffer,fmt,argptr); //将以argptr开始的参数按fmt中的格式输出到buffer中,形成一个数组
UartStr(buffer); //以串口的形式,将缓冲区中的数据打印出来
}
int main()
{
UartPrintf("%c %d %s %c",'c',45,"This a test");
return 0;
}
4、通过上例可以让串口打印函数时具有printf的效果,不用自己去编写识别%c,%d,%s等格式的函数,直接按标准的输出即可。