Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2314157
  • 博文数量: 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-05-12 09:26:54

关于用const 变量取代macro, 可以参考<>2nd item 1

这里要说的是如何找出项目中既有的这样的宏. 毕竟多数情况下你都是面临一个烂摊子.

grep ?
只能用它达到一个粗略的目标.

并非所有的宏定义都适合被const 替换, 所以pc-lint文档中说:
The message is issued for macros containing at least one constant or constant equivalent (an earlier
const-able macro or const variable) and no other variables or tokens such as ';' of a
non-expression nature.

pc-lint 关于此类的macro有一个警告: 1923

为了保持目标单一, 最好关掉所有其它的警告:
-e* +e1923
前者是去掉所有警告, 后者是专门打开个别警告.

使用 LintProject.exe 可以省去不少麻烦:
LintProject.exe RtlPrinter.vcproj tmp /param"-e* +e1923" /cfg"Release|Win32"

Lint的结果文件是一个由HTML 作为目录文件, 每个module作为一个纯文本文件的文件集合, 放在指定的tmp子目录下.

LintProject.exe的输出大致为:
Analysing file: Queue.cpp...255 issues
Analysing file: trace.cpp...2 issues

运行结果后, 到tmp目录下打开名为index.htm 的文件, 结果大致为:

点击每一个文件, 会打开纯文本的警告:


注意第一条中的警告, 几乎一定不你是想要的, 因为那是在IDE自动生成的资源头文件中, 对这类情况, 可以用一个全局的 -esym(1923, IDD_DIALOG1) 来单独关闭对它的警告, 对于自己定义的.cpp/.h 文件中的特殊情况, 你可能会有充足的理由定义一个宏来而不是使用const,如:

LOG_PRINTF 是我项目中的log 机制, 可以指定级别和开发者, 除此之外, 我还希望对每个 feature或功能点, 在log 时有一个统一的前辍, 根据DRY 原则, 我不希望在每个LOG 处手工写上这样的前辍, 而且也很难保证统一, 所以我在.cpp 文件范围内定义了个宏. 宏本身被定义为一个字符串, 这样可以利用C语言的一个特性: 连续的字符串常量在编译期被串接在一块. 用const char * const feature_prefix 也可达目标, 但就得用上面第二个框里的办法了, 这个办法不及宏的方案更优雅, 难怪Scott meyers说, 宏还不能完全退隐. 的确, 必要的时候还得请它出山.

上图中最后的注释是特别的, 特别给pc-lint 看的,
但是, 宏定义中不能指定一次性的临时 lint 选项 !e
上面 //lint -e1923 会对后续的处理都关掉这个警告. 不是我想要的.

文档中称的-save, -restore机制也不能生效.

经实验, 最好的办法是//lint -esym(1923, MY_NAME)
这一行可以紧挨着宏定义上面, 需要的文字量也更少. 用这个办法可以仅对 MY_NAME宏网开一面, 下面的MY_NAME_TOO 还是会被警告.


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