主要用于可变参数数目的函数中,用于解析可变的参数。
一般应用见printf, scanf等函数中,给个例子看看,CE中打印Trace消息
void NKDbgPrintfW(
const WCHAR *sz, ...)
{
unsigned char c;
va_list vl;
va_start(vl, sz);
while (*sz) {
c = (unsigned char)*sz++;
switch (c) {
case (unsigned char)'%':
c = (unsigned char)*sz++;
switch (c) {
case 'x':
pOutputNumHex(va_arg(vl, unsigned long), 0);
break;
case 'B':
pOutputNumHex(va_arg(vl, unsigned long), 2);
break;
case 'H':
pOutputNumHex(va_arg(vl, unsigned long), 4);
break;
case 'X':
pOutputNumHex(va_arg(vl, unsigned long), 8);
break;
case 'd': {
long l;
l = va_arg(vl, long);
if (l < 0) {
pOutputByte('-');
l = - l;
}
pOutputNumDecimal((unsigned long)l);
}
break;
case 'u':
pOutputNumDecimal(va_arg(vl, unsigned long));
break;
case 's':
OutputStringW(va_arg(vl, WCHAR *));
break;
case '%':
pOutputByte('%');
break;
case 'c':
c = va_arg(vl, unsigned char);
pOutputByte(c);
break;
default:
pOutputByte(' ');
break;
}
break;
case '/n':
pOutputByte('/r');
// fall through
default:
pOutputByte(c);
}
}
va_end(vl);
}
关于这三个函数的实现原理,可见这位老兄的分析,
关注编译器是如何实现上述函数的,可变参数在函数入栈的顺序,在内存中的布局。