海湾合作委员会有数以千计的选择来增加警告;我希望-Wall
-Wextra
-pedantic
包含所有有用的内容,但刚才我遇到-Woverloaded-virtual
这对我来说真的很好。
您使用或推荐哪些其他G ++参数?
答案 0 :(得分:2)
不完全相同的类别,但我总是使用-Werror
进行编译,将警告标记为错误。非常有用。
要使用第三方标题,我可以通过-isystem
而不是-I
添加这些标题...否则这些标题中的警告会破坏构建。
还有-Weffc++
警告Meyers的 Effective C ++ 中列出的具体问题。但是,我发现这太苛刻了。例如,它会警告没有声明虚拟析构函数的基类。从理论上讲,这非常好,但我正在开发一个模板库,它使用继承代码重用(和策略类),显然它们没有(也不需要)虚拟析构函数。
答案 1 :(得分:2)
见Best compiler warning level for C/C++ compilers?。一个帖子包含以下详尽(和令人筋疲力尽)的列表。
-g -O -Wall -Weffc++ -pedantic \
-pedantic-errors -Wextra -Wall -Waggregate-return -Wcast-align \
-Wcast-qual -Wchar-subscripts -Wcomment -Wconversion \
-Wdisabled-optimization \
-Werror -Wfloat-equal -Wformat -Wformat=2 \
-Wformat-nonliteral -Wformat-security \
-Wformat-y2k \
-Wimplicit -Wimport -Winit-self -Winline \
-Winvalid-pch \
-Wunsafe-loop-optimizations -Wlong-long -Wmissing-braces \
-Wmissing-field-initializers -Wmissing-format-attribute \
-Wmissing-include-dirs -Wmissing-noreturn \
-Wpacked -Wpadded -Wparentheses -Wpointer-arith \
-Wredundant-decls -Wreturn-type \
-Wsequence-point -Wshadow -Wsign-compare -Wstack-protector \
-Wstrict-aliasing -Wstrict-aliasing=2 -Wswitch -Wswitch-default \
-Wswitch-enum -Wtrigraphs -Wuninitialized \
-Wunknown-pragmas -Wunreachable-code -Wunused \
-Wunused-function -Wunused-label -Wunused-parameter \
-Wunused-value -Wunused-variable -Wvariadic-macros \
-Wvolatile-register-var -Wwrite-strings
答案 2 :(得分:1)
我见过的一些用过的东西;
-Wcast-qual
:每当指针被转换时发出警告,以便从目标类型中删除类型限定符。例如,警告const char *
是否投射到普通char *
。
-Wpointer-arith
:警告任何取决于函数类型或void
大小的内容。 GNU C将这些类型的大小分配为1,以便于使用void *
指针和指向函数的指针进行计算。
-Wwrite-strings
:编译C时,给字符串常量类型const char[length]
,这样将一个地址复制到非const
char *
指针就会收到警告;在编译C ++时,警告有关从字符串文字到char *
的已弃用转换。默认情况下,此警告已为C ++程序启用。这些警告将帮助您在编译时找到可以尝试写入字符串常量的代码,但前提是您在声明和原型中使用const
时非常小心。否则,这只会令人讨厌;这就是为什么我们没有让-Wall请求这些警告。
-Wdisabled-optimization
:如果请求的优化通道被禁用,则发出警告。此警告通常不表示您的代码有任何问题;它只是表明GCC的优化器无法有效地处理代码。通常,问题是您的代码太大或太复杂;当优化本身可能需要花费大量时间时,海湾合作委员会将拒绝优化计划。
答案 3 :(得分:1)
一般情况下,我启用所有警告,然后有选择地删除那些提供无用输出的标志。在我的一个项目中,我使用以下C和C ++警告:
-pedantic
-Wall
-Wextra
-Wformat=2
-Wmissing-include-dirs
-Wswitch-default
-Wswitch-enum
-Wunused
-Wstrict-aliasing=1
-Wfloat-equal
-Wundef
-Wunsafe-loop-optimizations
-Wpointer-arith
-Wcast-qual
-Wcast-align
-Wwrite-strings
-Wconversion
-Wmissing-format-attribute
-Wpacked
-Wredundant-decls
-Winvalid-pch
-Wvolatile-register-var
-Wsync-nand
-Wsign-conversion
-Wlogical-op
-Wmissing-declarations
-Wmissing-noreturn
-Wstrict-overflow=5
-Wstack-protector
此外,我使用以下C ++标志:
-std=c++98
-Wnon-virtual-dtor
-Wctor-dtor-privacy
-Wstrict-null-sentinel
-Woverloaded-virtual
-Wsign-promo
此外,对于发布版本,我启用以下警告:
-pedantic-errors
-Werror
-Wuninitialized
-Winit-self
-Wdisabled-optimization
我发现-Wall
只启用绝对最少的警告而不是“全部”,这一点非常令人讨厌,顾名思义。
答案 4 :(得分:1)
除了上面提到的那些:
-pedantic Issue warnings needed for strict compliance to the standard
-Wall
-Wextra Print extra (possibly unwanted) warnings
-Werror Treat all warnings as errors
-std=c++0x Conform to the ISO 1998 C++ standard, with extensions that are likely to be in C++0x
-std=c++98 Conform to the ISO 1998 C++ standard