没有可变参数支持的宏自动注入参数

Macro auto-injecting argument without VARIADIC support

本文关键字:参数 注入 支持 变参      更新时间:2023-10-16

我有一个带有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

但是我需要让这个宏在没有宏可变参数支持的情况下与编译器一起工作(在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

这些编译器不接受上一个宏定义中的注释,我从 https://stackoverflow.com/a/687412/926064 中得到了工作正常的if(1);else blablabla

但是我需要解决第一种情况,其中参数是由宏"注入"的。

一些解决方法?

编辑:

由于它不是支持多线程的软件,我正在考虑更改调试"框架"以使用侧函数注入参数以在"上下文"变量(全局、静态等)中设置值:

#define logdbg pass_args(__FNAME__); debugf

更多可能的解决方法?

假设不可能使用不同的编译器(这似乎是一个可疑的要求,但让我们把它放在一边),当然,你需要一个不同的函数来扩展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);
}

vdebugff就像debugff,除了需要va_list.

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