Chinaunix首页 | 论坛 | 博客
  • 博客访问: 376611
  • 博文数量: 73
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 2469
  • 用 户 组: 普通用户
  • 注册时间: 2013-07-16 23:51
个人简介

活泼开朗是我的特性。

文章分类
文章存档

2014年(27)

2013年(46)

分类: C/C++

2013-08-29 09:38:40

最近应需要,对项目中的warning进行清除,感觉PG对Linux和Windows下编程的差异性认识不够,衍生出了不少编译Warning,我只能悲催的帮其进行修复。C++没有Java那么随意,作为项目中的底层,重视Warnig,一来可以保持代码的健壮性,修复潜在的Bug。另外,考虑日后供给第三方作为lib,保持0 Warning就是必须了。下面,介绍主要遇到的Warning产生点:

(注:测试推荐使用在线编译器 )

1.format warning

   如果你用 %x 十六进制打印信息的话,稍不留意可能就是warning了。十六进制本身是无符号的,但是它所匹配的类型是unsigned int。在Windows中,int和long被认为是一样的,但是Linux下,long != int(Linux下,long与机器字长相关,32位机子占用4个字节,64位机子是8个字节;而Windows中均为4个字节,等同于int)。所以用 %x 匹配 unsigned long是不行的。

2.comparison warning

   当signed变量和unsigned变量比较时,就会产生此类警告。比如,我们使用sizeof和strlen时候,习惯依照其返回类型用size_t接收返回值,此时直接和int或者long类型变量做比较,则会出现warning。size_t是标准C库中定义的,应为unsigned int,但在64位系统中为long unsigned int。如果出现此类情况非得比较,比较好的建议是,做无符号像有符号转换。

3.reorder initialize warning

   这个出现于类的使用过程中,主要是在构造函数用初值表进行成员变量的初始化时,成员的初始化顺序与类中定义的顺序不一致导致。G++进行编译,会发现该问题。

4.missing braces warning

   当结构体嵌套使用,初始化不规范,会产生此类警告。
1
2
3
4
5
6
7
    
struct INER{
    int m_i;
};
struct EXTE{
    INER m_iner;
    int m_i;
};

   定义了以上结构,初始化的时候我们如果简单的赋值0的话,工具检测时就得爆出数条warning了,所以需要注意下。
1
    
EXTE exte={0};

   遇到结构体变量的初始化,还是推荐使用memset函数以避免不必要的麻烦。


   暂时列出几个容易忽略的问题,有机会再进行补充,以后编码时,多注意规范,避免不必要的Warning。
阅读(2055) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~