您为不同的C/C++编译器推荐了什么编译器警告级别?
gcc和g ++会让你在默认级别上获得很多东西.我发现对我来说最好的警告级别是'-Wall'.我总是试图删除修复它生成的警告的代码.(即使是愚蠢的关于使用括号进行逻辑优先规则或者说我的意思是'if(x = y)')
对于不同的编译器,您最喜欢的级别是什么,例如Sun CC,aCC(HPUX?),Visual Studio,intel?
编辑:
我只想指出我在gcc/g ++上没有使用"-Werror"(但我确实理解它的实用性),因为我使用:
#warning "this is a note to myself"
在我的代码中的几个地方.所有编译器都了解#warning宏吗?
这是我用于C++代码的一组超偏执的标志:
-g -O -Wall -Weffc++ -pedantic \ -pedantic-errors -Wextra -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
这应该会给你一些入门的东西.根据项目的不同,您可能需要对其进行调整,以便不会看到来自第三方库的警告(通常对于免费警告非常粗心.)例如,Boost矢量/矩阵代码将使g ++发出很多噪音
处理这种情况的一种更好的方法是编写一个围绕g ++的包装器,它仍然使用调整到最大值的警告但允许人们禁止它们被特定文件/行号看到.我很久以前就写过这样一个工具,一旦我有时间清理它就会释放它.
在Visual C++上,我使用/W4
和/WX
(将警告视为错误).
VC也有/Wall
,但它与标准头不兼容.
我选择将警告视为错误,因为这迫使我修复它们.我修复了所有警告,即使这意味着要添加#pragma
忽略警告 - 这样,我明确说明,我知道警告(因此其他开发人员不会通过电子邮件发送给我).
我相信VC也支持
#pragma message ("note to self")
但是随着系统的发展和成长,你每晚都会有30个开发人员同时工作,所以需要花费几天的时间来阅读所有自己的笔记,即使是自我将会做什么,除了笔记阅读,最后去在压力下无法跟上而不得不辞职......
实际上,如果允许它们,警告的数量很快就会增长,而且你将无法发现真正重要的警告(未初始化的变量,构造函数中使用的这个指针,......).
这就是我尝试将警告视为错误的原因:大多数情况下,编译器正确警告我,如果不是,我会在代码和前置文件中记录它
#pragma warning ( push ) #pragma warning ( 4191 : disable ) // violent code, properly documented #pragma warning ( pop )
我刚读过他们也有一个warning ( N : suppress )
pragma.
我倾向于使用-Wall
(因为每个人都-Werror
犯错误,没有人是完美的),但我不使用(将警告视为错误),因为现在和gcc警告无论如何都是正确的事情(误报).
我同意litb总是使用-Wall.此外,如果您想确保您的代码符合规定,您也可以使用-pedantic.如果您在字节级别处理联合和结构,则另一个警告可能是有用的-Wpadded.