Argument Access:va_start, va_arg, va_end, va_list

来源:互联网 发布:域名注册 公司英文 编辑:程序博客网 时间:2024/05/08 15:42

     主要用于可变参数数目的函数中,用于解析可变的参数。
     一般应用见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);
}

 

     关于这三个函数的实现原理,可见这位老兄的分析,
关注编译器是如何实现上述函数的,可变参数在函数入栈的顺序,在内存中的布局。

http://tech.ccidnet.com/art/1081/20050411/236377_2.html

原创粉丝点击