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