最近应需要,对项目中的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。
阅读(2048) | 评论(0) | 转发(0) |