pro*c中怎样使用变参宏

zjsen668 2011-08-09 10:54:21
自己写了一个打印的函数,用于实现分级打印的功能,函数原型大致如下:

int myPrint(int iLevel,const char* sFile,const char* sFunction, const char* sLine, const char* sFmt,...)
{
/*函数实现*/
}

然后想通过定义宏的形式,忽略掉sFmt之前的参数,以方便调用
宏定义为:

#define logInfo(__VA_ARGS__) myPrint(_LEVEL_INFO,__FILE__,__FUNCTION__,__LINE__,__VA_ARGS__)
#define logError(__VA_ARGS__) myPrint(_LEVEL_ERROR,__FILE__,__FUNCTION__,__LINE__,__VA_ARGS__)

此程序直接用cc编译后可以正常使用,能达到效果,但是在pro*c里面调用logInfo()时如果参数超过一个就会编译出错,从网上查得是pro*c不支持变参宏。
请问有没有办法可以使pro*c支持这个宏,或是通过其他办法,可以让我再调用我的myPrint()函数时,免去输入“_LEVEL_INFO,__FILE__,__FUNCTION__,__LINE__”这些参数?
...全文
133 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
zjsen668 2011-08-10
  • 打赏
  • 举报
回复
有没有高手帮帮忙啊,项目中需要啊
icemornings 2011-08-09
  • 打赏
  • 举报
回复
由于不大懂C99,所以我还是把C99的变参数宏的相关说明复制上来,也许还能骗个分……
来自http://blog.163.com/zhaojie_ding/blog/static/17297289520115210564890/
--------------------------
变参宏(Variadic Macros)

变参宏的最大好处是可以让你很容易地用宏来封装一些带变参的函数(主要是打印函数),如可以这样写一个输出到stderr的宏:

#define print_err(...) fprintf(stderr, __VA_ARGS__)

宏参数里面“...”的部份会展开到__VA_ARGS__处。如果在__VA_ARGS__前面加上##,就可以写出允许变参部份为空的变参宏。比如我自己常用的调试信息打印宏:

#define debug(fmt, ...) \
printf("[DEBUG] %s:%d <%s>: " fmt, \
__FILE__, __LINE__, __func__, ##__VA_ARGS__)

##__VA_ARGS__表示变参“...”部份允许为空。当变参部份为空时__VA_ARGS__会展开成空字符串,并且##前面那个逗号也会在展开时去掉。于是你可以这样调用这个宏:debug("Hello");
wjjjuniniho 2011-08-09
  • 打赏
  • 举报
回复
写错了,指针是不能作为默认参数的。。。

[Quote=引用 1 楼 wjjjuniniho 的回复:]

你可以试试default parameter,就是类似于myPrint(int iLevel = xxx, const char* sFile=xxx, const char* sFunction=xxx,const char* sLine=xxx, const char* sFmt=xxx, ...)
[/Quote]
icemornings 2011-08-09
  • 打赏
  • 举报
回复
C语言不支持默认参数。
C89不支持变参数宏

请看《C99的新特性(2)》
http://blog.163.com/zhaojie_ding/blog/static/17297289520115210564890/
[Quote=引用 1 楼 wjjjuniniho 的回复:]

你可以试试default parameter,就是类似于myPrint(int iLevel = xxx, const char* sFile=xxx, const char* sFunction=xxx,const char* sLine=xxx, const char* sFmt=xxx, ...)
[/Quote]
wjjjuniniho 2011-08-09
  • 打赏
  • 举报
回复
你可以试试default parameter,就是类似于myPrint(int iLevel = xxx, const char* sFile=xxx, const char* sFunction=xxx,const char* sLine=xxx, const char* sFmt=xxx, ...)

69,368

社区成员

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

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