请教宏应用高手

THEBEST 2009-11-20 10:06:04
我现在有一个函数是

void debug(const char *fmt, ...);这样的。

我用的时候一般都是这样调用的

debug("%s,%d|%s", __FILE__, __LINE__, "调试信息");

但我现在觉得每次用__FILE__, __LINE__很累,但我又不能改debug这个函数的定义。所以我想有没有办法用宏来实现

我最后想用的接口是 debug("这是我要打印的信息!%s", "调试信息");

但输出和上面的效果是一样的,我试了一下,

#define mydebug(fmt, arg...) debug("%s,%d,"##fmt, __FILE__, __LINE__, ##arg)

最后预编译出来是debug("%s,%d""%s", __FILE__, __LINE__, "调试信息");

会报错。

fmt不能接收 "%s,%d""%s"两个字符串相连的参数,我不知道为什么。有什么办法吗?
...全文
398 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
mstlq 2009-11-21
  • 打赏
  • 举报
回复
如果我是楼主,搞那么久还没搞定的话,早就换用函数实现了^_^……
yizhili 2009-11-21
  • 打赏
  • 举报
回复
我用的是VC

网上查到说楼主的写法是 GCC 的扩展,我查到的写法是 C99 标准
看编译器怎么实现的吧
do_fork 2009-11-21
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 yizhili 的回复:]
解决了:
C/C++ code#define mydebug(fmt, arg, ...) debug("%s,%d,"##fmt, __FILE__, __LINE__, ##arg, __VA_ARGS__)

用 __VA_ARGS__ 代表参数里的 ...
[/Quote]

gcc报错了
error: pasting ""%s,%d,"" and ""%d"" does not give a valid preprocessing token
benbshmily 2009-11-21
  • 打赏
  • 举报
回复
#define mydebug(fmt, arg...) do{debug("%s,%d " __FILE__, __LINE__);debug(fmt, arg...); }while(0);
调用两次debug呗。第一次我先把__FILE__, __LINE__这个打印出来,然后再调用一次debug输出真正想输出的东西。
东大坡居士 2009-11-21
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 forestdb 的回复:]
#define my_debug(A) debug("%s,%d|%s", __FILE__, __LINE__, A)
还有更复杂的需求,换个思路。
[/Quote]
顶一个体!!!!
ForestDB 2009-11-21
  • 打赏
  • 举报
回复
#define my_debug(A) debug("%s,%d|%s", __FILE__, __LINE__, A)
还有更复杂的需求,换个思路。
do_fork 2009-11-21
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 yizhili 的回复:]
我用的是VC

网上查到说楼主的写法是 GCC 的扩展,我查到的写法是 C99 标准
看编译器怎么实现的吧
[/Quote]

在C99出来之前,是gcc的扩展,后来纳入C99了
yizhili 2009-11-20
  • 打赏
  • 举报
回复
解决了:
#define mydebug(fmt, arg, ...) debug("%s,%d,"##fmt, __FILE__, __LINE__, ##arg, __VA_ARGS__)


用 __VA_ARGS__ 代表参数里的 ...
yizhili 2009-11-20
  • 打赏
  • 举报
回复
#define mydebug(fmt, arg, ...) debug("%s,%d,"##fmt, __FILE__, __LINE__, ##arg)

yizhili 2009-11-20
  • 打赏
  • 举报
回复
好吧,实测了一下:
#define mydebug(fmt, arg...) debug("%s,%d,"##fmt, __FILE__, __LINE__, ##arg)

报错:
error C2010: “.”: 宏形参表中的意外
然后改了一下:
#define mydebug(fmt, arg, ...) debug("%s,%d,"##fmt, __FILE__, __LINE__, ##arg)

编译通过
THEBEST 2009-11-20
  • 打赏
  • 举报
回复
上面没有一位给出了解决办法哦,宏有...的用法

有没有高手啊?
yizhili 2009-11-20
  • 打赏
  • 举报
回复
"%s,%d""%s" 应该没问题,是 ... 的问题吧
宏定义应该没有 ... 的用法
象 MFC 里的 TRACE 都是用定义 TRACE0, TRACE1 等等定义出来的
jernymy 2009-11-20
  • 打赏
  • 举报
回复

#define MyDebug(const char *fmt, ...) debug("%s,%d|%s", __FILE__, __LINE__, "调试信息")


然后去调用MyDebug?这样不可以么?
do_fork 2009-11-20
  • 打赏
  • 举报
回复
#define join(x,y) x##y


这两个是不同的
join(x, y)
join("x", "y")
THEBEST 2009-11-20
  • 打赏
  • 举报
回复
上面的DX难道不知道C中默认"ss""bb"相当于"ssbb"吗?

比如printf("ss""bb")是没问题的,我直接调用debug("ss""bb")也是没问题的,但如果是通过宏展开的即使展开后的结果一模一样但就是不行。
XIEXIAOLIN1989MENG 2009-11-20
  • 打赏
  • 举报
回复
N
jackyjkchen 2009-11-20
  • 打赏
  • 举报
回复
"%s,%d""%s"本来就是不对的格式,嵌套"要用\"

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧