在学习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
|