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) |