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

标签 c++ c unix macros c89

我有一个带有可变参数的宏,它会自动注入(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/

相关文章:

c++ - Qt 快速 2 : Creating and adding a shared library

c++ - 无法在 CMAKE 项目中使用 XercesC

c++ - 刷新 GLUT 窗口

c++ - 64 位机器上 int 和 sizeof int 指针的大小

unix - grep 为何运行得这么快?

c++ - 用于插入集合的配对相等运算符重载

c - realloc 和指向 c 结构和函数中的整数比较问题的指针

c - 替代 gethostbyname 我可以在哪里选择 DNS 服务器?

c - C中的信号控制

linux - 在 unix bash 脚本中组织代码