没有可变参数支持的宏自动注入参数
Macro auto-injecting argument without VARIADIC support
我有一个带有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
.
如果需要线程安全,请使用特定于线程的存储,而不是公共全局存储。
相关文章:
- 如何反转整数参数包
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 如何使用默认参数等选择模板专业化
- 模板参数替换失败,并且未完成隐式转换
- 具有默认模板参数的多态类的模板推导失败
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 函数调用中参数的顺序重要吗
- 部分定义/别名模板模板参数
- 模板-模板参数推导:三个不同的编译器三种不同的行为
- 使用不带参数的函数访问结构元素
- 基于另一个成员参数将函数调用从类传递给它的一个成员
- 如何在OMNET++中指定与命令行参数组合的输出文件名
- 如何使用Luacneneneba API正确读取字符串和表参数
- 在派生函数中指定void*参数
- 如何在窗口中使用注入的 dll 中的参数调用函数
- MySQL 从注入过渡到参数化时遇到麻烦
- 使用参数调用远程进程中的函数(注入的 DLL)
- 依赖注入/继承设计模式的构造函数参数太多
- 没有可变参数支持的宏自动注入参数