请教c语言中变参宏的问题

jiuchang 2011-03-21 07:02:38
我定义了一个变参函数
int log(int level, log_location_t *location, log_t *log, const char *fmt, ...);
用来记录日志

现在想通过宏来调用该函数,这样在编程过程中使用比较方便。但是现在找不到一个把宏中的变参传递给函数的方法,试了几种都没有成功。

我的变参宏是这样定义的
#define LOG_DEBUG(fmt...) log(LOG_LEVEL_DEBUG, log_location(__FILE__, __func__, __LINE__), ##fmt)

在调用的地方如下面这样使用:
DI_LOG_DEBUG(plog, "this is a debug log, a=%d", 3);
结果表明fmt后面的参数没有被传递给变参函数,只是把log函数要求的最少4个参数给传递了过去。
把##fmt修改为__VA_ARGS__,结果编译通不过,有这样的警告信息:
警告:__VA_ARGS__ 只能出现在 C99 可变参数宏的展开中

不知道大家有没有传递变参的经验,该如何解决呢?
...全文
233 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
hurongfz 2011-03-22
  • 打赏
  • 举报
回复
#define myprintf(templt,...) fprintf(stderr,templt,__VA_ARGS__)
4楼这样的就行了,这样不就是传递可变参数
AnYidan 2011-03-22
  • 打赏
  • 举报
回复
网上搜索一下
jiuchang 2011-03-22
  • 打赏
  • 举报
回复
to schoolers:
这篇文章我也看到了,他是直接在宏中调用最终的printf类函数,和我的需求不一样

to wangell:
你说的这种方法太麻烦了,涉及内存的申请、释放等一系列的操作。并且参数个数不定,参数大小也不定,实现起来问题会很多
jinzhou520 2011-03-21
  • 打赏
  • 举报
回复
想当然定义是不行的. 你可以参考可变参数的格式,需要用到它那一套东西的,而不是自己定义的.
其实你的没必要做这么复杂,前面的都是一样的格式的,完全可以封装成一个结构,然后传递结构的首地址过去便可以了,这样定义的,完全可以和main的实现相同.
某某9 2011-03-21
  • 打赏
  • 举报
回复
...在C宏中称为Variadic Macro,也就是变参宏。比如:


#define myprintf(templt,...) fprintf(stderr,templt,__VA_ARGS__)


或者#define myprintf(templt,args...) fprintf(stderr,templt,args)


第一个宏中由于没有对变参起名,我们用默认的宏__VA_ARGS__来替代它。第二个宏中,我们显式地命名变参为args,那么我们在宏定义中就可以
用args来代指变参了。同C语言的stdcall一样,变参必须作为参数表的最后有一项出现。当上面的宏中我们只能提供第一个参数templt时,C
标准要求我们必须写成: myprintf(templt,);的形式。这时的替换过程为:myprintf("Error!\n",);替换为:
fprintf(stderr,"Error!\n",).


这是一个语法错误,不能正常编译。这个问题一般有两个解决方法。首先,GNU CPP提供的解决方法允许上面的宏调用写成:
myprintf(templt);而它将会被通过替换变成: fprintf(stderr,"Error!\n",);


很明显,这里仍然会产生编译错误(非本例的某些情况下不会产生编译错误)。除了这种方式外,c99和GNU CPP都支持下面的宏定义方式:


#define myprintf(templt, ...) fprintf(stderr,templt, ##__VAR_ARGS__)


这时,##这个连接符号充当的作用就是当__VAR_ARGS__为空的时候,消除前面的那个逗号。那么此时的翻译过程如下:
myprintf(templt);被转化为: fprintf(stderr,templt);


这样如果templt合法,将不会产生编译错误。
http://www.cnblogs.com/areliang/archive/2007/08/02/840455.html
hoomey 2011-03-21
  • 打赏
  • 举报
回复
#define LOG_DEBUG log

这样定义不行吗?宏定义的时候一定要带参数?
愤怒的熊猫007 2011-03-21
  • 打赏
  • 举报
回复
在书上见过还真没自己弄过,学习了~

69,373

社区成员

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

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