LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1578|回复: 6

关于使用 __VA_ARGS__的问题

[复制链接]
发表于 2006-11-6 23:42:37 | 显示全部楼层 |阅读模式
代码如下:

  1. debian@debian:~/network$ cat test.c
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5. #include <sys/errno.h>
  6. #include <stdarg.h>

  7. #define logFP stdout
  8. #define LOGBUFLEN 512

  9. void pErr(int flag,char *fmt,...)
  10. {
  11.         if(NULL == logFP)
  12.                 {
  13.                         printf("log file pointer is null\n");
  14.                         return;
  15.                 }
  16.         char pBuf [LOGBUFLEN + 1];
  17.         int savedErrno = errno;
  18.         bzero(pBuf,LOGBUFLEN + 1);

  19.         va_list al;
  20.         va_start(al,fmt);
  21.         vsprintf(pBuf,fmt,al);
  22.         if(flag)
  23.                 {
  24.                         sprintf(pBuf + strlen(pBuf),": %s",strerror(savedErrno));
  25.                 }
  26.         strcat(pBuf,"\n");
  27.         fputs(pBuf,logFP);
  28.         va_end(al);
  29. };

  30. #define pErrQuit(flag,fmt,...)  \
  31.         {pErr(flag,fmt,__VA_ARGS__); \
  32.         exit(-1); \
  33.         }
  34. int main()
  35. {
  36.         int i = 10;
  37.         pErrQuit(0,"i is %d",i);/* 这样展开宏没有问题*/
  38.         pErrQuit(0,"i is null"); /* 这里编译的时候error: expected expression before ')' token */
  39.         return 0;
  40. }

复制代码


请高手帮忙解决.
 楼主| 发表于 2006-11-6 23:47:54 | 显示全部楼层
问题解决.
#define pErrQuit(flag,fmt,...)  \
        {pErr(flag,fmt,__VA_ARGS__); \
        exit(-1); \
        }
当实际不带变参的时候,fmt后面扩展多了一个",",在__VA_ARGS__前面加##可解决.
回复 支持 反对

使用道具 举报

发表于 2006-11-15 10:13:18 | 显示全部楼层
我也一直搞不清楚参数前加##表示什么?请明晰的人给点意见
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-11-16 00:01:28 | 显示全部楼层
(fmt,__VA_ARGS__)既然是变长参数,有可能就只有(fmt,),这种时候前面多一个逗号.编译会报错,使用##__VA_ARGS__就可以了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-11-16 00:02:20 | 显示全部楼层
(fmt,__VA_ARGS__)既然是变长参数,有可能就只有(fmt,),这种时候前面多一个逗号.编译会报错,使用##__VA_ARGS__就可以了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-11-16 00:03:54 | 显示全部楼层
刚才浏览器有问题,点了两下...
回复 支持 反对

使用道具 举报

发表于 2006-11-16 10:18:39 | 显示全部楼层
Post by neva
我也一直搞不清楚参数前加##表示什么?请明晰的人给点意见


##是将前后的标识连接成一个字符串
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表