我有一个包含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但是,我需要让这个宏在没有宏VARIADIC支持的情况下使用编译器(在SCO Unix和AIX4.3Copmiler 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获得了工作正常的https://stackoverflow.com/a/687412/926064
但我还需要一个解决第一种情况的方法,在这种情况下,一个论点被宏观“注入”。
想办法解决这个问题?
编辑:
由于它不是一个多线程支持的软件,所以我考虑修改调试“框架”,使用附带函数注入参数,以在“上下文”变量(全局、静态等)中设置值:
#define logdbg pass_args(__FNAME__); debugf更有可能的解决办法?
发布于 2015-06-11 20:32:24
假设不可能使用不同的编译器(这似乎是一个可疑的要求,但让我们暂且不谈),可以肯定的是,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。
如果需要线程安全,请使用特定于线程的存储,而不是通用全局存储。
https://stackoverflow.com/questions/30789877
复制相似问题