不定数量参数的实现

 
       在学习windows程序设计时,遇到的不定个参数项的函数的例子。
源代码如下:
/*-----------------------------------------------------
   SCRNSIZE.C -- Displays screen size in a message box
                 (c) Charles Petzold, 1998
 -----------------------------------------------------*/
 
#include <windows.h>
#include <tchar.h>    
#include <stdio.h>    
 
int CDECL MessageBoxPrintf (TCHAR * szCaption, TCHAR * szFormat, ...)
{
     TCHAR   szBuffer [1024] ;
     va_list pArgList ;
 
          // The va_start macro (defined in STDARG.H) is usually equivalent to:
          // pArgList = (char *) &szFormat + sizeof (szFormat) ;
 
     va_start (pArgList, szFormat) ;
 
          // The last argument to wvsprintf points to the arguments
 
     _vsntprintf (szBuffer, sizeof (szBuffer) / sizeof (TCHAR),
                  szFormat, pArgList) ;
 
          // The va_end macro just zeroes out pArgList for no good reason
 
     va_end (pArgList) ;
 
     return MessageBox (NULL, szBuffer, szCaption, 0) ;
}
 
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
                    PSTR szCmdLine, int iCmdShow)
{
     int cxScreen, cyScreen ;
 
     cxScreen = GetSystemMetrics (SM_CXSCREEN) ;
     cyScreen = GetSystemMetrics (SM_CYSCREEN) ;
 
     MessageBoxPrintf (TEXT ("ScrnSize"),
                       TEXT ("The screen is %i pixels wide by %i pixels high."),
                       cxScreen, cyScreen) ;
     return 0 ;
}
这应该是以前学C语言时应该掌握的知识,但是亡羊补牢,为时不晚。
例如 int printf( const char *format [, argument]... );
int wprintf( const wchar_t *format [, argument]... );
就是这样的函数,在函数的参数列表中,参数的个数是不定的,依据我们的需要而定。我们应该怎样写自己的函数让它随我们的需要而改变参数的个数,还有我们应该在什么情况下用到这样的函数?
首先,查看msdn,其中有一组宏va_alist专门用作这类函数的实现。下面是msdn的部分文档:
va_arg, va_end, va_start
Access variable-argument lists.
type va_arg( va_list arg_ptr, type );
void va_end( va_list arg_ptr );
void va_start( va_list arg_ptr );   (UNIX version)
void va_start( va_list arg_ptr, prev_param );   (ANSI version)
Routine
Required Header
Optional Headers
Compatibility
va_arg
<stdio.h> and <stdarg.h>
<varargs.h>1
ANSI, Win 95, Win NT
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值