编译阶段警告信息有助于排查代码中错误,合理配置编译警告信息能够提高开发效率。
通过了解编译警告,也能够了解到哪些代码风格是不好的,有哪些代码的书写格式是容易出现问题的,有助于让自己写出更高质量的代码。

-fsyntax-only

检查代码中的语法错误,但是不做任何处理,通常用作语法检查。
在使用这个参数以后,编译器仅仅检查代码中的语法错误并予以提示,并不会生成目标文件。

-w

禁止所有的报警信息

-Werror

将所有的警告视为错误

-Wfatal-errors

在出现第一条错误信息停止编译

-Wall

启用以下警告

-Waddress
-Warray-bounds=1 (only with -O2)
-Wbool-compare
-Wbool-operation
-Wc++11-compat  -Wc++14-compat
-Wcatch-value (C++ and Objective-C++ only)
-Wchar-subscripts
-Wcomment
-Wduplicate-decl-specifier (C and Objective-C only)
-Wenum-compare (in C/ObjC; this is on by default in C++)
-Wformat
-Wint-in-bool-context
-Wimplicit (C and Objective-C only)
-Wimplicit-int (C and Objective-C only)
-Wimplicit-function-declaration (C and Objective-C only)
-Winit-self (only for C++)
-Wlogical-not-parentheses
-Wmain (only for C/ObjC and unless -ffreestanding)
-Wmaybe-uninitialized
-Wmemset-elt-size
-Wmemset-transposed-args
-Wmisleading-indentation (only for C/C++)
-Wmissing-braces (only for C/ObjC)
-Wmultistatement-macros
-Wnarrowing (only for C++)
-Wnonnull
-Wnonnull-compare
-Wopenmp-simd
-Wparentheses
-Wpointer-sign
-Wreorder
-Wrestrict
-Wreturn-type
-Wsequence-point
-Wsign-compare (only in C++)
-Wsizeof-pointer-div
-Wsizeof-pointer-memaccess
-Wstrict-aliasing
-Wstrict-overflow=1
-Wswitch
-Wtautological-compare
-Wtrigraphs
-Wuninitialized
-Wunknown-pragmas
-Wunused-function
-Wunused-label
-Wunused-value
-Wunused-variable
-Wvolatile-register-var

-Wextra

启用以下警告

-Wclobbered
-Wcast-function-type
-Wempty-body
-Wignored-qualifiers
-Wimplicit-fallthrough=3
-Wmissing-field-initializers
-Wmissing-parameter-type (C only)
-Wold-style-declaration (C only)
-Woverride-init
-Wsign-compare (C only)
-Wtype-limits
-Wuninitialized
-Wshift-negative-value (in C++03 and in C99 and newer)
-Wunused-parameter (only with -Wunused or -Wall)
-Wunused-but-set-parameter (only with -Wunused or -Wall)

-Wdelete-incomplete

(C++ and Objective-C++ only)
析构一个指向不完整的类型的指针,可能会造成运行时错误未定义行为。
这个警告默认是开启的。

-Wuseless-cast

(C++ and Objective-C++ only)
变量被转换为自身类型。

-Wduplicated-branches

用于检查在 if/else 语句中是否存在返回值相同的结果返回值。

-Wduplicated-cond

用于检查在 if/else 语句中存在相同的条件

-Wfloat-equal

检查使用等号比较float相等的情况

-Wformat

检查printf相关函数中的格式字符串是否符合与后续的实际参数对应。
该项检查在 -Wall 中默认开启,可以通过 -Wformat=0 进行关闭。

配置范例

这里是正在使用的警告相关的参数配置

#编译时的警告信息
WARNING_FLAG = -Wall -Wextra -Wfatal-errors -Wpedantic \
	     -Wswitch-default -Wundef -Wpointer-arith \
	     -Woverloaded-virtual -Wnon-virtual-dtor \
	     -Wno-unused-parameter \
	     -Wuseless-cast -Wformat-security -Wformat-nonliteral \
	     -Wduplicated-branches -Wduplicated-cond -Wfloat-equal