【发布时间】:2015-06-11 19:35:37
【问题描述】:
我有一个带有可变参数的宏,它自动注入一些参数,比如下面的第一个注入参数“__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
但我还需要一个解决方案来解决第一种情况,即参数被宏“注入”。
一些解决方法可以做到这一点?
编辑:
由于它不是支持多线程的软件,我正在考虑更改调试“框架”以使用辅助函数注入参数来设置“上下文”变量(全局、静态等)中的值:
#define logdbg pass_args(__FNAME__); debugf
更多可能的解决方法?
【问题讨论】:
-
旁注:
logdbg if(1);else debugf看起来没什么好处(您可以将其包装成do { ... } while(0) -
在这些平台上安装一个体面的编译器——例如 GCC。应该会更快吧。请注意,
##__VA_ARGS__符号已经是 GCC 特定的;它不适用于任何其他编译器。其实,说到这里,__FNAME__也不是标准的 C。 -
@JonathanLeffler:安装其他编译器不是一种选择。
-
只安装一个现代 CPP(C 预处理器)并在编译代码之前使用它怎么样?你在一个非常粘的检票口上。该代码使用的功能在标准的最旧版本 C89/C90 中没有对应功能。它是 C99 中的一个有价值的补充,因为它允许您完成以前无法完成的事情。
-
@DieterLücking “看起来没什么好”......确实。我想你可能稍微低估了这一点。一点点……