免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 8428 | 回复: 2
打印 上一主题 下一主题

__VA_ARGS__可变参数最后的逗号怎么去掉 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-05-21 15:09 |只看该作者 |倒序浏览
比如说有这样一个宏定义:
#define err_log(fmt, ...) fprintf(stderr, fmt, __VA_ARGS__)
这就要求可变参数中到少有一个参数。如果我想这样用
err_log("open file failed\n");
那么经过宏扩展后,就会变成:
fprintf(stderr, "open file failed\n", );
在fprintf的参数列表中最后的逗号后面没有参数。在编译时就会报错。
如果定义成
#define err_log(fmt, ...) fprintf(stderr, fmt, ##__VA_ARGS__)
在扩展后就会变成:
fprintf(stderr, "open file failed\n");
这样就不会报错。

但是上面的##只在gcc编译器下能够用,在solaris的CC中不能用,又其他的办法能够在只有一个参数时去掉最后的逗号吗

论坛徽章:
0
2 [报告]
发表于 2007-05-21 15:19 |只看该作者
#define err_log(...) fprintf(stderr, __VA_ARGS__)

你定義了fmt,當然必須得有一個fmt了,不過你可以不定義。

论坛徽章:
0
3 [报告]
发表于 2007-05-21 15:32 |只看该作者
  1. function(const char* str, ...)
  2. {
  3.     va_list ap;
  4.     va_start( ap, str );
  5.     vfprintf( stdout, str, ap );
  6.     va_end( ap );
  7. }
复制代码


这里只能接受C格式的串,我想定义一个宏,让他也支持C++的流,
在GNU g++中可以这样
  1. #define log(logEvent, ...) \
  2.             do \
  3.             { \
  4.                 ostringstream ostr; \
  5.                 ostr<<ostr; \
  6.                 string str = ostr.str(); \
  7.                 function(str.c_str(), ##__VA_ARGS__); \
  8.             }while(0)
复制代码


但是在其他的编译器中不支持##的写法
在其他编译器中如果这样调用log("test");就回解析成function("test" , )。即参数最后有一个逗号,有什么办法能够在只有一个参数时,去掉最后的逗号
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP