【visual studio】编译告警常见处理手段
[TOC]
C2001
常量中有换行符
文件保存为 UTF-8 签名
C4100
“*” 类型未使用
windows 代码文件中使用
1 |
|
如果是在Qt中,则可以使用
1 |
|
另外,也不建议使用上述两种方式。当实现接口或标准导出内的方法时,有一些参数没有被引用是相当常见的。编译器会发现未 使用的参数,并产生一个警告,有些组件甚至会认为这是一个错误。为避免发生如此情况, 将未使用的参数使用/* 参数名 */ 语法将其注释掉。不要使用 UNREFERENCED_PARAMETER() 宏,因为其 1)太繁琐,2)并不能保证参数实际上真的未被引用。
最好的方法就是在函数接口中注释掉未使用的变量。
1 |
|
C4805
操作类型混合不安全:一般在操作
bool
和int
时会触发这一警告
简单处理就是不要使用这种作为判断的依据,要么用 bool
类型,要么用 int
类型。
- 也可以使用强制转换。
C4996
GetVersionExA
被声明为已否决
碰见这种情况,需要关闭项目的SDL检查。
1 |
|
其他
- ‘qsort’:Use std::sort
C5208
出现这个问题的原因是 C 风格代码和 C++ 风格代码混用导致的,结构体在 C 和 C++ 中是不一样的:
C
1 |
|
CPP
1 |
|
具体原因是:最新的C++20标准中,为了更好的实现模块module的特性,typedef 一个未命名的struct被限制为只能使用纯粹的c语言语法,它不能通过赋值进行类内初始化了。
所以修改的方案就是不要声明匿名结构体,在声明时创建结构体名。
C6387
警告内容:“***”可能是0,这不符合函数“****”的规范。
这个问题就是函数参数没有做校验,也就是判空等情况,如下所示代码就会出现该警告:
1 |
|
修改为如下所示:
1 |
|
LNK4098
LINK : warning LNK4098: 默认库“LIBCMT”与其他库的使用冲突;请使用 /NODEFAULTLIB:library
简单处理就是在VS项目属性 -> 链接器 -> 命令行 中添加上述提示的内容。以 LIBCMT
库为例:添加内容如下所示:
1 |
|
LNK4099
warning LNK4099: 未找到 PDB“cryptlib.pdb”(使用“cryptlib.lib(cryptlib.obj)
一般这种情况属于使用了开源库编译的lib,在项目中使用时,调试信息格式选择了 /zi
选项。因此会提示没有 obj
文件。
解决办法就是程序调试信息选择无即可。另外就是我们编译过程中如果需要调试信息格式,也就是pdb该怎么同时处理这两个问题: