0. 摘要
应该高度重视警告,所以在编译的时候使用最高的警告级别。应该要求构建是干净利落的,通过修改代码降低警告而不是降低警告级别来排除警告。
1. CMakeLists中设置警告模式
如下所示,其中-Werror是将警告都以错误的形式报出,这样只要有警告就会不通过,在这种严苛的环境下,会帮助我们养好的编程习惯,不要忽视警告
cmake_minimum_required(VERSION 3.1)
project(highwarning)
if (MSVC)
# warning level 4 and all warnings as errors
add_compile_options(/W4 /WX)
else()
# lots of warnings and all warnings as errors
add_compile_options(-Wall -Wextra -pedantic -Werror)
endif()
add_subdirectory(src bin)
2. 常见的警告
2.1 未使用的函数参数
这个是最简单的C++代码,我们的主函数中传入了外部传参argc和argv,但实际过程中没有用这两个函数。
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char ** argv){
return 0;
}
此时,如果进行编译,我们就会发现报错或者报警告如下
如果在实际中确认了这两个参数确实不会被用到,但是又想预留传入位置,可以将参数注释,但是保留数据类型,如下
#include <stdio.h>
#include <stdlib.h>
int main(int /*argc*/, char ** /*argv*/){
return 0;
}
再进行编译发现报错消失了
2.2 定义了未使用的变量
定义未使用变量如下所示
#include <stdio.h>
#include <stdlib.h>
void func(){
int a;
}
int main(int /*argc*/, char ** /*argv*/){
func();
return 0;
}
导致警告或者报错如下:
如果确实不需要,可以插入一个变量本身的求值表达式,这种操作本身不会影响运行速度。
#include <stdio.h>
#include <stdlib.h>
void func(){
int a;
a;
}
int main(int /*argc*/, char ** /*argv*/){
func();
return 0;
}
实际操作过程中,我们可能还是会报错和警告,需要重新cmake一下配置,然后再make,一两次以后就不会报错了。一般也不建议使用这种操作了,直接删掉变量比较好
2.3 变量使用前未经初始化
下述代码的speedupFactor
#include <stdio.h>
#include <stdlib.h>
// unused varible
void func(){
}
// unused parameters
int main(int /*argc*/, char ** /*argv*/){
func();
// init
int speedupFactor;
bool condition = true;
if (condition){
speedupFactor = speedupFactor+1;
}
else{
speedupFactor = 1;
}
return 0;
}
对参数进行初始化
#include <stdlib.h>
// unused varible
void func(){
}
// unused parameters
int main(int /*argc*/, char ** /*argv*/){
func();
// init
int speedupFactor = 0;
bool condition = true;
if (condition){
speedupFactor = speedupFactor+1;
}
else{
speedupFactor = 1;
}
return 0;
}
2.4 建议常量放在==左边
这个其实是一种书写习惯,本身放在左边和放在右边没有任何区别,但是放在左边一旦漏了一个=号编译器会帮忙报错,因为这时候等号是赋值的意思。
但是当你用-Werror模式下,这种错误也会以报错的形式出来
#include <stdio.h>
#include <stdlib.h>
// unused varible
void func(){
}
// unused parameters
int main(int /*argc*/, char ** /*argv*/){
func();
// init
int speedupFactor = 0;
bool condition = true;
int flag = 0;
while(flag=5)
if (condition){
speedupFactor = speedupFactor+1;
}
else{
speedupFactor = 1;
}
return 0;
}