如何在非可变变量旁边定义可变变量宏?

时间:2019-07-09 07:13:01

标签: c++ visual-studio-2017 macros variadic-macros

最好的方法是用代码显示它。我将其编译为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: ')'

如何定义它以使其采用可变形式和非可变形式?

1 个答案:

答案 0 :(得分:0)

TRACE宏的第二个定义似乎重新定义了第一个,因此实际上您最终定义了TRACE(x,...)。

然后使用 VA_ARGS ,可能需要使用带有双“#”前缀的它。例如

#define TRACE(fmt, ... )   printf(fmt, ##__VA_ARGS__)

使用gcc对我来说效果很好。