说起来,程序员界有一个梗,程序员只认识error不认识warning,但是其实,有一些warning很可能是bug的根源,或者说是潜在的问题,过多无意义的warning也会覆盖真正有意义的bug。因此,有能力,谨慎的程序员应该避免写出有warning的代码。
下面,集中介绍几种我在windows c++编程中遇到的warning:
1.非常量引用的初始值必须是左值
int fun(Object& object);
//调用:
int nOut = fun(new Object());
d当函数使用引用而不是常量引用时,编译器认为会在函数内部修改该参数的值,而传入一个右值(比如说一个临时变量),后面则无法再使用,编译器则认为你做错了。——因此不修改的引用最好使用常量引用,或者避免传入右值
2. warning C4800: “BOOL”: 将值强制为布尔值“true”或“false”(性能警告)
在windows中,BOOL其实是一个宏,其实它是一个int,为0就是false, 否则为true。和c++的bool是不等同的。为了避开此警告可以使用:
BOOL bIsOk = FALSE;
bool bIs = bIsOk != FALSE;
3. warning C4819: 该文件包含不能在当前代码页(936)中表示的字符。请将该文件保存为 Unicode 格式以防止数据丢失
936对应的是GBK编码,该文件中可能存在必须以Unicode编码才能识别的字符,在GBK可能会乱码。不过这个修改目前还不知道能不能上传到git上。
4. warning C4996: 'itoa': The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: _itoa.
有很多类似的函数: strcpy, spintf等函数,当使用安全开发原则时,vs都会弹出警告,让你使用加了 “_s”的函数。
5. warning C4010: 单行注释包含行继续符
在此处看看是不是有语法疏漏
6. warning C4018: “<”: 有符号/无符号不匹配
有符号和无符号是可以互相转换,而且不会丢失信息的(超过合法范围只是不会正常显示而已,再次强转就可以正常显示),但是不可以进行比较操作。
7. warning C4002: “MF_CSProt_S2C_LogEx”宏的实参太多
8. warning C4127: 条件表达式是常量
9.数据类型截断: 比如说把long long强转成int, 高32位的信息就丢失了。
10. warning C4068: 未知的杂注