如何格式化变量参数TCHAR

时间:2013-05-08 15:44:06

标签: c++ printf variadic-functions

void LogWriter::WriteLog(LPCTSTR log, const char ending, LPTSTR args, ...)
{
    TCHAR str[128] = {0};
    int len = (sizeof(log)/sizeof(TCHAR));
    len += sizeof(ending)/sizeof(char); //might switch ending to TCHAR..might have to

    _stprintf_s(str, len+4, "%s()%c", log, ending);
    myOutput.push(str);
    //used to output to console for testing
    //if (args != NULL)
    //{
    //    va_list argptr;
    //    va_start(argptr, args);
    //    vfprintf(stdout, args, argptr);
    //    va_end(argptr);
    //}
}

所以这是一种很酷的方式将我的日志打印到控制台..但现在我希望能够选择我放置日志的位置。我决定只将wcout重定向到文件或控制台。当我输出到控制台时,这样做非常容易,因为我只有

void LogWriter::WriteLog(const char* log, const char ending, char* args, ...)
{
    std::wcout << log << "(";
    if (args != NULL)
    {
        va_list argptr;
        va_start(argptr, args);
        vfprintf(stdout, args, argptr);
        va_end(argptr);
    }
    std::wcout << ")" << ending << std::endl;
}

并且生活很美好...当它是单线程程序并且所有日志记录都进入控制台时。所以我想我会使用队列在我的日志中临时存储行。在一个单独的线程中,我清空队列并睡眠500毫秒。这很好用(我还没有对它进行过一些测试,但是对于速度/性能而言)但是对于sprintf函数,它在输出中给我带来了胡言乱语。如果我一起摆脱sprintf只是将日志推送到我的队列,它会正确输出字符串。引导我说我为sprintf做错了,但我也需要/希望变量参数也进入那里......嗯这可能意味着改变某事。我有一些可能会影响的宏..

#define WRITE_START LogWriter::WriteLog(__FUNCTION__, '+')
#define WRITE_STARTF(_smsg, ...) LogWriter::WriteLog(__FUNCTION__, '+', _smsg, __VA_ARGS__) 

//example of usage
void test1(LPCTSTR lpclDevClass, LPCTSTR lpclDevName)
{
    WRITE_STARTF(_T("*%s* %s"), lpclDevClass, lpclDevName);
}
void test2()
{
    WRITE_START;
}

关于我应该怎么做的任何想法?谢谢

0 个答案:

没有答案