Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2315204
  • 博文数量: 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-04-03 00:07:06

发现了 _countof, 欣喜地比较它与 SIZEOF_ARRAY的优缺点, 决定以后能用则用_countof, 并且把程序里所有的SIZEOF_ARRAY替换成了_countof, 却没想到程序中碰到这样的问题:
  int ia[3];
#pragma warning(disable: 4127)
  if( -2 > _countof(ia) )
  {
    printf("Hello, world, x\n");
  }
竟然结果为true,
***  _countof 的类型类似于 size_t , 是某种 unsigned的整型!
惨痛!
 
说说怎么预防:
1. VC2008带的VC编译器, cl /W4  也不会得到警告.
    cl /Wall   同样不会
    公司不让用盗版的Team System了, 所以没了Code Analysis, 但我猜测它也不会.
 
   * 没错, 我知道有人会说, 你把VC当gcc了, 是的, cl.exe 也支持/Wall 选项. cl /? 可以看到, 帮助说明是
  /Wall enable all warnings
  区分大小写的
 
2. pc-lint  对这句话
   Warning 574: Signed-unsigned mix with relational
 
发现一个不好的编程方式时, 一个好的做法是, 用pc-lint 的选项 +e"*" 打开所有警告跑一遍它, 然后找找看有没有对应的警告, 如果发现, 就记下它的警告号, 这里是574, 这个警告号对pc-lint 的各个版本来说应该是一样的. 其帮助的PDF文件中还会详细给出说明.
 
然后, 在CVS服务器上, 把这一条强制进一个代码提交时的自动检查程序, 当然就是pc-lint了. 以保这种错误永远不会发生.
阅读(1554) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~