我经常听到,在编译C和C ++程序时,我应该“始终启用编译器警告”。为什么这是必要的?我怎么做?

有时我还听说我应该“将警告视为错误”。我是不是该?我怎么做?

最佳答案

为什么启用警告?

众所周知,C和C ++编译器在默认情况下不善于报告一些常见的程序员错误,例如:


忘记初始化变量
忘记从函数中抄送return
printfscanf系列中的参数与格式字符串不匹配
使用函数而无需事先声明(仅C)


这些可以被检测和报告,通常不是默认情况下;必须通过编译器选项显式请求此功能。

如何启用警告?

这取决于您的编译器。

Microsoft C和C ++编译器了解/W1/W2/W3/W4/Wall之类的开关。至少使用/W3/W4/Wall可能会为系统头文件发出虚假警告,但是如果您的项目使用这些选项之一进行了正确的编译,则应使用。这些选项是互斥的。

其他大多数编译器都可以理解-Wall-Wpedantic-Wextra之类的选项。 -Wall是必不可少的,建议所有其他内容使用(请注意,尽管名称为-Wall,但-Werror仅启用最重要的警告,而不是全部警告)。这些选项可以单独使用,也可以一起使用。

您的IDE可能有一种从用户界面启用这些功能的方法。

为什么将警告视为错误?它们只是警告!

编译器警告表示您的代码中可能存在严重的问题。上面列出的问题几乎总是致命的。其他可能会或可能不会,但您希望编译失败,即使事实证明这是错误的警报。调查每个警告,找到根本原因,然后加以解决。如果发生错误警报,请解决它-即,使用其他语言功能或结构,以便不再触发警告。如果事实证明这很难,请逐个禁用该特定警告。

您不希望仅将警告作为警告,即使它们都是错误警报。对于发出警告的总数少于7个的非常小的项目,这可能还可以。而且,新警告很容易在大量熟悉的旧警告中丢失。不要这样只要使您的所有项目都能干净地编译即可。

请注意,这适用于程序开发。如果要以源代码形式向世界发布项目,那么最好不要在已发布的构建脚本中提供/WX或等效内容。人们可能会尝试使用不同版本的编译器或完全不同的编译器来构建您的项目,这可能会启用一组不同的警告。您可能希望他们的建造成功。始终启用警告仍然是一个好主意,以便看到警告消息的人可以向您发送错误报告或补丁。

如何将警告视为错误?

再次使用编译器开关完成此操作。 -Werror适用于Microsoft,其他大多数使用。无论哪种情况,如果产生任何警告,编译都会失败。

08-17 15:31
查看更多