c++ - 没有VARIADIC支持的宏自动注入参数

c++ - 没有VARIADIC支持的宏自动注入参数,第1张

我有一个带有varargs的宏,它会自动注入一些参数,就像下面第一个注入参数“__FNAME__”:

#ifdef VERBOSE
#define logdbg(format, ...) debugff(__FNAME__, format, ##__VA_ARGS__)
#elif defined(NORMAL)
#define logdbg(format, ...) debugf(format, ##__VA_ARGS__)
#else
#define logdbg(format, ...) /* debud off */
#endif

但我需要让这个宏与没有MACRO VARIADIC支持的编译器一起工作(在SCO Unix和AIX 4.3 Copmiler v3中)。

在这些环境中我现在有:

#ifdef VERBOSE
#define logdbg debugff(__FNAME__, format, ##__VA_ARGS__)
#elif defined(NORMAL)
#define logdbg debugf
#else
#define logdbg if(1);else debugf
#endif

这些编译器没有接受上一个宏定义中的注释,我得到了if(1);else blablabla

#define logdbg pass_args(__FNAME__); debugf

但是我还需要第一种情况的解决方案,其中一个参数由宏“注入”。

要做一些解决方法吗?

修改

由于它不是一个支持多线程的软件,我想改变调试'框架'以使用辅助函数注入参数来设置'class="superseo">context'变量中的值(全局,静态等):

{{1}}

更多可能的解决方法?

最佳答案:

1 个答案:

答案 0 :(得分:1)

假设 不可能 使用不同的编译器(这似乎是一个可疑的要求,但让我们把它放在一边),肯定会,你需要一个不同的功能logdbg扩展为。{}可能该函数将从另一个源获取__FNAME__参数,如全局变量。

#define logdbg ((logdbg_fname__ = __FNAME__), debugff_broken)

void debugff_broken(const char *fmt, ...) {
    extern const char *logdbg_fname__;
    va_list ap;
    va_start(ap, fmt);
    vdebugff(logdbg_fname__, fmt, ap);
    va_end(ap);
}

vdebugffdebugff类似,但需要va_list

如果需要线程安全,请使用特定于线程的存储而不是通用的全局存储。

本文经用户投稿或网站收集转载,如有侵权请联系本站。

发表评论

0条回复