请问这个的宽字符形式是什么样的 __VA_ARGS__

你妹的特盗不 2010-04-29 02:33:52
#define WIDEN2(x) L ## x
#define WIDEN(x) WIDEN2(x)
#define __WFILE__ WIDEN(__FILE__)
这个定义是MSDN上面翻出来的
__LINE__ __FUNCTION__ 这些都可用使用这个宏

__VA_ARGS__ 这个这样使用就会出现,请问怎么使用

那天不小心在CSDN上面看到有人给了一个写日志的宏,是不支持UNICODE的
我准备改下,就遇到这个问题
相关代码如下

/*******************************************************************
created: 29:4:2010 12:20
purpose: 日志函数
@parament: none
*******************************************************************/
#ifdef _UNICODE

#ifndef UNICODE
#define UNICODE
#endif

#define WIDEN2(x) L ## x
#define WIDEN(x) WIDEN2(x)
#define __WFILE__ WIDEN(__FILE__)
#define __WFUNCTION__ WIDEN(__FUNCTION__)
#define __WLINE__ WIDEN(__LINE__)
#define __WVA_ARGS__ WIDEN(__VA_ARGS__)


#define log_printf(ls, fn, ln, yorn, ... ) do { \
ofstream logTest(L"foo.log"); \
streambuf *oldbuf = cout.rdbuf(logTest.rdbuf()); \
WCHAR log[2560] = {0}; \
WCHAR logCxx[4096] = {0}; \
_snwprintf_s(log, sizeof(log), __WVA_ARGS__ ); \
fn != NULL ? swprintf_s(logCxx, L"%s %s at %s on line %d.\n %s\n", ls, __WFUNCTION__, fn , ln, log) : swprintf_s(logCxx, L"%s %s\n %s\n", ls, __WFUNCTION__, log) ; \
yorn == 'y' ? (1==1) : (1==1) ; \
cout<<logCxx;\
cout.rdbuf(oldbuf); \
}while(0);

#define log_error( ... ) log_printf(L"Error:", __WFILE__, __WLINE__, 'n', __VA_ARGS__ )
#ifdef _DEBUG
#define log_debug( ... ) log_printf(L"Debug:", __WFILE__, __WLINE__, 'n', __VA_ARGS__ )
#else//_DEBUG
#define log_debug( ... ) do {} while(0);
#endif //_DEBUG

#define log_fetal( ... ) log_printf(L"Fetal:", __WFILE__, __WLINE__, 'y', __VA_ARGS__ )

#define qlog( ... ) log_printf(L"Info:", (WCHAR*)0, 0, 'n', __VA_ARGS__ )
#else //_UNICODE
#define log_printf(ls, fn, ln, yorn, ... ) do { \
ofstream logTest("foo.log"); \
streambuf *oldbuf = cout.rdbuf(logTest.rdbuf()); \
char log[2560] = {0}; \
char logCxx[4096] = {0}; \
_snprintf_s(log, sizeof(log), __VA_ARGS__ ); \
fn != NULL ? sprintf_s(logCxx, "%s %s at %s on line %d.\n %s\n", ls, __FUNCTION__, fn , ln, log) : sprintf_s(logCxx, "%s %s\n %s\n", ls, __FUNCTION__, log) ; \
yorn == 'y' ? (1==1) : (1==1) ; \
cout<<logCxx;\
cout.rdbuf(oldbuf); \
}while(0);

#define log_error( ... ) log_printf("Error:", __FILE__, __LINE__, 'n', __VA_ARGS__ )
#ifdef _DEBUG
#define log_debug( ... ) log_printf("Debug:", __FILE__, __LINE__, 'n', __VA_ARGS__ )
#else//_DEBUG
#define log_debug( ... ) do {} while(0);
#endif //_DEBUG

#define log_fetal( ... ) log_printf("Fetal:", __FILE__, __LINE__, 'y', __VA_ARGS__ )

#define qlog( ... ) log_printf("Info:", (char*)0, 0, 'n', __VA_ARGS__ )

#endif//_UNICODE
...全文
526 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
Eleven 2010-05-06
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 lfs09 的回复:]
#define WIDEN2(x) L ## x
用_T的话,这个宏怎么改啊
[/Quote]
#ifdef _UNICODE
#define WIDEN2(x) L ## x
#else
#define WIDEN2(x) x
#endif

this ????
lovechinaloveme 2010-05-06
  • 打赏
  • 举报
回复
看不太懂楼主的意思
SullenSun 2010-05-06
  • 打赏
  • 举报
回复
#define WIDEN2(x) _T(x)
你妹的特盗不 2010-05-06
  • 打赏
  • 举报
回复
高手出来啊
你妹的特盗不 2010-04-29
  • 打赏
  • 举报
回复
#define WIDEN2(x) L ## x
用_T的话,这个宏怎么改啊
你妹的特盗不 2010-04-29
  • 打赏
  • 举报
回复
我用的是 vs2008 英文版的
jameshooo 2010-04-29
  • 打赏
  • 举报
回复
VC2005 才开始支持 __VA_ARGS__
尹成 2010-04-29
  • 打赏
  • 举报
回复
帖子都沉底了,帮楼主顶下
liwei3290 2010-04-29
  • 打赏
  • 举报
回复
VC6.0的编译器不支持 __VA_ARGS__这个宏


_L 改成_T
你妹的特盗不 2010-04-29
  • 打赏
  • 举报
回复
warning C4003: not enough actual parameters for macro 'WIDEN2'
error C2065: 'L' : undeclared identifier

改下 __LINE__ 不支持那个宏

__VA_ARGS__ 使用那宏,就出现上面那错误不使用的话,就会说 _snwprintf_s 这个函数的第三个参数不对

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧