为什么我应该启用警告?
众所周知,C 和 C++ 编译器不善于报告一些常见的程序员错误默认情况下, 例如:
- 忘记初始化变量
- 忘记
return
来自函数的值
- 中的论据
printf
and scanf
系列与格式字符串不匹配
- 使用函数时无需事先声明(仅限 C)
这些可以被检测到并报告,但通常不是默认情况下;必须通过编译器选项明确请求此功能。
如何启用警告?
这取决于您的编译器。
Microsoft C 和 C++ 编译器理解开关,例如/W1
, /W2
, /W3
, /W4
and /Wall
。至少使用/W3
. /W4
and /Wall
可能会针对系统头文件发出虚假警告,但如果您的项目使用这些选项之一可以干净地编译,请使用它。这些选项是互斥的。
大多数其他编译器都理解类似的选项-Wall https://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html#index-Wall, -Wpedantic https://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html#index-Wpedantic and -Wextra https://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html#index-Wextra. -Wall
是必不可少的,其余的都是推荐的(请注意,尽管它的名字,-Wall
只启用最重要的警告,而不启用all其中)。这些选项可以单独使用,也可以一起使用。
您的 IDE 可能有办法从用户界面启用这些功能。
为什么我应该将警告视为错误?它们只是警告!
编译器警告表明代码中存在潜在的严重问题。上面列出的问题几乎都是致命的;其他人可能是也可能不是,但你希望编译失败even if事实证明这是一场虚惊。调查每个警告,找到根本原因并修复它。如果出现误报,请解决它 - 即使用不同的语言功能或结构,以便不再触发警告。如果这被证明非常困难,请根据具体情况禁用该特定警告。
即使所有警告都是误报,您也不希望仅将警告保留为警告。对于非常小的项目来说,发出的警告总数少于 7 个,这可能没问题。如果超过 7 个,新的警告很容易淹没在大量旧的熟悉的警告中。不允许这样做。只是让你的所有项目都能干净地编译。
请注意,这适用于程序开发。如果您以源代码形式向全世界发布您的项目,那么最好不要提供-Werror https://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html#index-Werror或您的同等学历released构建脚本。人们可能会尝试使用不同版本的编译器或完全不同的编译器来构建您的项目,这可能会启用一组不同的警告。您可能希望他们的构建成功。保持警告启用状态仍然是一个好主意,以便看到警告消息的人可以向您发送错误报告或补丁。
如何将警告视为错误?
这也是通过编译器开关完成的。/WX
适用于 Microsoft,大多数其他人使用-Werror
。无论哪种情况,如果产生任何警告,编译都会失败。
这够了吗?
可能不会!当您提高优化级别时,编译器开始越来越仔细地查看代码,这种更仔细的检查可能会发现更多错误。因此,不要满足于警告开关本身,在启用优化的情况下进行编译时始终使用它们(-O2
or -O3
, or /O2
如果使用 MSVC)。