关于 __VA_ARGS__ 宽字符版本的问题

清泛原创
在写一个可变参数的记录日志函数,考虑到宽字符(Unicode版本)时:


#define WIDEN2(x) L ## x
#define WIDEN(x) WIDEN2(x)
#define __WFILE__ WIDEN(__FILE__)#define __WFUNCTION__ WIDEN(__FUNCTION__)
__LINE__, __FUNCTION__ 这些都可用使用这个宏拓展成宽字符版,__VA_ARGS__ 这样使用就会出现编译错误。
其实,据我所知 __VA_ARGS__</a> 应该是没有对应宽字符版本可以用的,它本身传递的可变参数是不论单 / 宽字符的。
所以单从这个方向入手貌似行不通,换个思路,找一个可以匹配单 / 宽字符的可变参数处理函数便可以解决,如下:

#define logging(x, ...) \
        Log(__FUNCTION__, __LINE__, (x), __VA_ARGS__)

void Log(LPCSTR func, INT line, LPCTSTR fmt, ...)
{
        // 设置地域,不然_vftprintf_s写不了中文
        setlocale(0, "chs");

        FILE *fp = NULL;
        va_list args;
        va_start(args, fmt);

// 中间无关紧要的,略。
        _vftprintf_s(fp, fmt, args);
        fclose(fp);
        va_end(args);
}


此函数可以通用于单 / 宽字符下的日志记录。

__VA_ARGS__ 宽字符

分享到:
评论加载中,请稍后...
创APP如搭积木 - 创意无限,梦想即时!
回到顶部