我被困在这里......
#include <stdio.h>
#define DBG_LVL(lvl, stmt) \
do{ \
if(lvl>1) printf stmt; \
}while(0)
#define DBG_INFO(stmt) DBG_LVL(1, stmt)
#define DBG_ERROR(stmt) DBG_LVL(2, stmt)
int main()
{
DBG_INFO(("hello, %s!\n", "world"));
DBG_ERROR(("crazy, %s!\n", "world"));
return 0;
}
如您所见,上面的代码使用“DBG_INFO”或“DBG_ERROR”等宏来控制调试信息级别。
现在出于某种原因,我必须用新功能替换DBG_LVL()
。
void myprint(int lvl, const char * format, ...);
唯一的区别是调试级别被视为其fisrt参数。 我在想:
#define DBG_LVL(lvl, stmt) myprint(lvl, stmt)
当然失败了,因为“stmt”表达式包括周围的括号。 然后我用Google搜索试图找到剥离括号的方法,似乎没有什么可以帮助。 我还尝试了一些技巧将参数传递给“stmt”,但仍然失败...... :(
你能帮助我吗?
答案 0 :(得分:10)
# define EXPAND_ARGS(...) __VA_ARGS__
# define DBG_LVL(lvl, stmt) myprint(lvl, EXPAND_ARGS stmt);
答案 1 :(得分:2)
不要将其写为宏。
写一个普通的varargs函数:
void DBG_LVL(int level, char *fmt, ...)
{
if (level < 1) return;
va_list args;
va_start(args, fmt);
vaprintf(fmt, args);
va_end(args);
}
对于myprint()
,也要定义类似的vamyprint(int lvl, const char *format, va_list ap)
,并以相同的方式转发。