gpt4 book ai didi

c++ - 不支持 VARIADIC 的宏自动注入(inject)参数

转载 作者:太空宇宙 更新时间:2023-11-04 03:37:53 26 4
gpt4 key购买 nike

我有一个带有可变参数的宏,它会自动注入(inject)一些参数,比如下面第一个注入(inject)参数“__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

这些编译器不接受最后一个宏定义中的注释,我从 https://stackoverflow.com/a/687412/926064 得到了运行良好的 if(1);else blablabla

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

有什么解决方法吗?

编辑:

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

#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);
}

vdebugffdebugff 类似,只是它需要一个 va_list

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

关于c++ - 不支持 VARIADIC 的宏自动注入(inject)参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30789877/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com