首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >不支持VARIADIC的宏自动注入参数

不支持VARIADIC的宏自动注入参数
EN

Stack Overflow用户
提问于 2015-06-11 19:35:37
回答 1查看 176关注 0票数 1

我有一个包含varargs的宏,它自动注入一些参数,比如下面的第一个注入参数"__FNAME__":

代码语言:javascript
复制
#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

但是,我需要让这个宏在没有宏VARIADIC支持的情况下使用编译器(在SCO Unix和AIX4.3Copmiler v3中)。

在这些环境中,我现在有:

代码语言:javascript
复制
#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获得了工作正常的https://stackoverflow.com/a/687412/926064

但我还需要一个解决第一种情况的方法,在这种情况下,一个论点被宏观“注入”。

想办法解决这个问题?

编辑:

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

代码语言:javascript
复制
#define logdbg pass_args(__FNAME__); debugf

更有可能的解决办法?

EN

回答 1

Stack Overflow用户

发布于 2015-06-11 20:32:24

假设不可能使用不同的编译器(这似乎是一个可疑的要求,但让我们暂且不谈),可以肯定的是,logdbg需要一个不同的函数来扩展。可能,该函数将从另一个源(如全局变量)获取__FNAME__参数。

代码语言:javascript
复制
#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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30789877

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档