Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2349596
  • 博文数量: 527
  • 博客积分: 10343
  • 博客等级: 上将
  • 技术积分: 5565
  • 用 户 组: 普通用户
  • 注册时间: 2005-07-26 23:05
文章分类

全部博文(527)

文章存档

2014年(4)

2012年(13)

2011年(19)

2010年(91)

2009年(136)

2008年(142)

2007年(80)

2006年(29)

2005年(13)

我的朋友

分类: WINDOWS

2009-06-03 19:55:43

pc-lint 8.00x

#define A(x,...)  /*lint -save -e26 */ printf(x,__VA_ARGS__)  /*lint -restore*/
#define B(x,...)   printf(x,__VA_ARGS__) 
A("asdf");
B("1234");

这段代码中, 如果不禁止第26号错误, pc-lint的预处理会把 A("asdf")展开成
        printf("asdf",)

它没有正确处理__VA_ARGS__个数为0时, 那个多余的逗号要去除掉的问题. 到pc-lint的讨论版上一看, 这个问题在2003年就有了, 看来一直没有很好解决.

对于宏展开引起的错误, 不适宜在使用宏的地方逐个地用lint 注释来解决, 而是应该在宏定义处一次解决, 虽然这也会引起一些真正的错误被漏过去.

注意上面的语法, 实验表明.
#define A(x,...) /*lint -save -e26*/ printf(x,__VA_ARGS__)  //lint -restore

就不行, 一个用C风格注释, 另一个用C++风格注释, 从原理上讲, 没道理不行的, 但PC-Lint 就是不行, 没有把状态正确恢复, 这样B中的错误也就被漏过去了.

另外, 用下面的注释形式也被证明不行:
#define A(x,...)  printf(x,__VA_ARGS__)  /*lint !e26*/
这一点在PC-Lint文档上倒是有明确指出
A limitation is that the one-line message suppression may not be placed within macros.

阅读(1194) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~