如何在非可变参数宏旁边定义可变参数宏

How to define a variadic macro beside a non-variadic one?

本文关键字:参数 变参 定义      更新时间:2023-10-16

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

它以使其同时采用可变参数和非可变参数形式的方法是什么?

似乎 TRACE

宏的第二个定义重新定义了第一个,因此您最终有效地定义了 TRACE(x, ...(。

然后要使用VA_ARGS可能需要将其与双"#"前缀一起使用。

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

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