g++ warning option

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信息:

  • 指针与0做比较( <, <=, > 或 >= );
  • 条件表达式中出现枚举与非枚举的比较; (C++)
  • 有歧义的虚基类; (C++)
  • 订阅已经定义为register数组;(C++)
  • 取一个已声明为register的变量地址; (C++)
  • 基类未在继承类的拷贝构造函数中初始化; (C++)

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









你可能感兴趣的:(C,&,C++)