最好的方法是用代码显示它。我将其编译为Visual Studio 2017下的Win32 C ++项目:
#include <strsafe.h>
#include <stdio.h>
//Trace outout
#ifdef _DEBUG
#define TRACE(s) ::OutputDebugString(s)
#define TRACE(s, ...) \
{ WCHAR __dbg_buff[1024]; if(SUCCEEDED(::StringCchPrintf(__dbg_buff, _countof(__dbg_buff), s, __VA_ARGS__))) { ::OutputDebugString(__dbg_buff);} else ASSERT(NULL);}
#else
#define TRACE(s) ((void)0)
#define TRACE(s, ...) ((void)0)
#endif
想法是在以下两种情况下使用宏:
TRACE(L"value=%02X", v);
TRACE(L"\n");
但是我的宏定义会产生此错误:
warning C4005: 'TRACE': macro redefinition
note: see previous definition of 'TRACE'
error C2059: syntax error: ')'
如何定义它以使其采用可变形式和非可变形式?
答案 0 :(得分:0)
TRACE宏的第二个定义似乎重新定义了第一个,因此实际上您最终定义了TRACE(x,...)。
然后使用 VA_ARGS ,可能需要使用带有双“#”前缀的它。例如
#define TRACE(fmt, ... ) printf(fmt, ##__VA_ARGS__)
使用gcc对我来说效果很好。