WIN32API学习日记060723
今天看了《Windows程序设计》的第二章,遇到了一点问题,主要是在书上的这种形式的函数中:
- int CDECL MessageBoxPrintf (TCHAR * szCaption, TCHAR * szFormat, ...) { TCHAR szBuffer [1024] ; va_list pArgList ; va_start (pArgList, szFormat) ; _vsntprintf (szBuffer, sizeof (szBuffer) / sizeof (TCHAR), szFormat, pArgList); va_end (pArgList) ; return MessageBox (NULL, szBuffer, szCaption, MB_ICONINFORMATION) ; }
疑点有两处,一是int后面的CDECL属于什么样的语法格式,在谭浩强版的《C程序设计》中并没有说到过这种形式的函数写法,而WinMain()函数一般也写作:
- int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) ;
在网上搜索后了解到,这个位置的参数是函数调用约定,主要是规定编译时用于参数的堆栈的管理方式,由于编译原理还没有学,只是看了一个大概的意思。CDECL是缺省的调用约定,允许不确定的参数数量。
还有一点没有见过的是参数列表最后的”…”,虽然能够大致猜到这个表示了不确定的参数数目,但是具体是什么意思,语法应该是什么样,提供在前面的参数有什么用,都不是很清楚。
书上关于这个提到两句话:
The va_list, va_start, and va_end macros (defined in STDARG.H) help in working with this stack pointer.
The va_start macro sets pArg to point to the variable on the stack right above the szFormat argument on the stack.
不过看了以后还是不是很理解,最后在CSDN找到了答案。《C语言之可变参数问题》
我理解的是这样的:pArgList存储了参数列表中szFormat后面的各个参数,然后被作为最后一个参数传递到_vsntprintf()中,作为参数(有点像是把主函数的参数列表copy到这个子函数中)。
PS:不知道是我使用的问题还是coolcode的问题,为什么怎么写都没办法得到想要的代码效果呢。郁闷。
Tags: Programming , Study , WIN32API