g++ warning可以分成三类:
1. -Wall 定义所有构造相关的警告, 用户觉得可疑的, 易规避的, 甚至宏联合的警告. -Wall 包含以下warning flags:
-Waddress -Warray-bounds (须与-O2联用) -Wc++0x-compat -Wchar-subscripts -Wimplicit-int -Wimplicit-function-declaration -Wcomment
-Wformat -Wmain(仅限C/ObjC) -Wmissing-braces -Wnonnull -Wparenthese -Wpointer-sign -Wreorder -Wreturn-type -Wsign-compare(仅限C++)
-Wsequence-point -Wstrict-aliasing -Wstrict-overflow=1 -Wswitch -Wtrigraphs
-Wuninitialized -Wunknown-pragmas -Wunused-function -Wunused-label -Wunused-value -Wunused-variable -Wvolatile-register-var
2. -Wextra 定义一部分除-Wall以外的警告, 包含以下warning flags:
-Wclobbered -Wempty-body -Wignored-qualifiers -Wmissing-filed-initializers -Wmissing-paramerter-type(仅限C) -Wold-stype-declaration(仅限C)
-Woverride-init -Wsign-compare -Wtype-limits -Wuninitialized -Wunused-parameter(须于-Wunused或-Wall联用)
以下情况-Wextra也会显示warning信息:
3. 除-Wall 及 -Wextra 以外的warning选项, 这类非常多,具体可以查看相关文档: https://linux.die.net/man/1/g++
编译警告可以用以下方式指定在以文件为范畴去开关:
#pragma GCC diagnostic kind option
kind: warning, error, ignored.
option: warning options.
并且支持push, pop对options进行栈操作.
#pragma GCC diagnostic push | pop
当option栈pop空之后将直接使用命令行传入的warning选项.
e.g.:
#pragma GCC diagnostic error "-Wuninitialized" /*将未初始化设为error警告*/
foo(a);
#pragma GCC diagnostic push /*压栈*/
#pragma GCC diagnostic ignored "-Wuninitialized" /*忽略未初始化警告*/
foo(b);
#pragma GCC diagnostic pop /*出栈, 此时仍是将未初始化设为error警告*/
foo(c);
#pragma GCC diagnostic pop /*再次出栈, 此时warning依赖于命令行所传入的选项*/
在编译时以编译器的方式输出字符串string, 这只是一个打印显示,即不是编译警告,也不是编译错误.
#pragma message string
Refer links:
https://gcc.gnu.org/onlinedocs/gcc/Diagnostic-Pragmas.html#Diagnostic-Pragmas