WIndows系统编程使用标准C库

时间:2015-11-08 22:13:25

标签: c debugging winapi

我正在阅读Johnson M. Hart Windows系统编程。他有一种方法可以使用 va_start 标准c方法。在下面的示例中,有人可以解释为什么处理hOut 传递给 va_start

BOOL PrintStrings (HANDLE hOut, ...)

/* Write the messages to the output handle. Frequently hOut
    will be standard out or error, but this is not required.
    Use WriteConsole (to handle Unicode) first, as the
    output will normally be the console. If that fails, use WriteFile.

    hOut:   Handle for output file. 
    ... :   Variable argument list containing TCHAR strings.
        The list must be terminated with NULL. */
{
    DWORD msgLen, count;
    LPCTSTR pMsg;
    va_list pMsgList;   /* Current message string. */
    va_start (pMsgList, hOut);  /* Start processing msgs. */
    while ((pMsg = va_arg (pMsgList, LPCTSTR)) != NULL) {
        msgLen = lstrlen (pMsg);
        if (!WriteConsole (hOut, pMsg, msgLen, &count, NULL)
                && !WriteFile (hOut, pMsg, msgLen * sizeof (TCHAR), &count, NULL)) {
            va_end (pMsgList);
            return FALSE;
        }
    }
    va_end (pMsgList);
    return TRUE;
}

1 个答案:

答案 0 :(得分:1)

va_start是一个提取可变参数的宏。它的工作原理是在第一个variadic参数之前给出参数。关键是va_start需要知道可以找到可变参数的位置。它们在最后命名的参数后立即找到。因此使用hOut

有关如何实现可变参数的一些细节: