//不使用VA_ARG的情况
int MsgShow( int ibtstate ,TCHAR * szCaption,TCHAR * szMsgTxt, … )
{
TCHAR sztxtBuffer [1024] ;
va_list pArgList ;
/* The va_start macro is means
pArgList = (char *) &szFormat + sizeof (szFormat) ;
(defined in STDARG.H)*/
va_start (pArgList, szMsgTxt) ;
//使用更安全的函数代替_vsntprintf
StringCchVPrintf(sztxtBuffer,strlen(sztxtBuffer)+1,sztxt,parglist);
// The va_end macro just zeroes out pArgList for no good reason
va_end (pArgList) ;
return MessageBox (GetTopWindow(NULL), sztxtBuffer, szCaption, ibtstate) ;
}
//———————————————->如果使用VA_ARG,这个是根据微软文档改编的
int average(int count_t, int first, … )
{
int count = 0, sum = 0, i = first;//把i初始化为first是很重要的,不这样的话就会丢了第一个数据,i在这里相当于缓冲区,
va_list marker;
va_start( marker, first ); /* Initialize variable arguments. */
/*while( i != -1 )原来的微软实现方法
{*/
for(int k=0; k<count_t; k++)
{
//被我改成for循环了,这样才比较准确,否则你的变量参数里面有-1岂不惨了?如果想实现输入一个值也能实现该功能,再写一个同名函数就可以了
sum += i;
count++;
i = va_arg( marker, int);
}
va_end( marker ); /* Reset variable arguments. */
return( sum ? (sum / count) : 0 );
}
//———————————————–>这个是上面的简化版本,始于写代码
void average(int count_t, int first, … )
{
int arraybuf[128]= {0}, i = first; //把i初始化为first是很重要的,不这样的话就会丢了第一个数据,i在这里相当于缓冲区,
va_list marker;
va_start( marker, first ); /* Initialize variable arguments. */
for(int k=0; k
没有评论:
发表评论