gpt4 book ai didi

c++ - 为什么我应该始终启用编译器警告?

转载 作者:行者123 更新时间:2023-11-30 16:11:48 25 4
gpt4 key购买 nike

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

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

最佳答案

为什么要启用警告?

C 和 C++ 编译器在默认情况下报告一些常见的程序员错误是出了名的糟糕,例如:

  • 忘记初始化变量
  • 忘记从函数返回
  • printfscanf 系列中的参数与格式字符串不匹配
  • 在未事先声明的情况下使用函数(仅限 C)

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

如何启用警告?

这取决于您的编译器。

Microsoft C 和 C++ 编译器支持 /W1/W2/W3/W4 等开关和/Wall。至少使用/W3/W4/Wall 可能会针对系​​统头文件发出虚假警告,但如果您的项目使用这些选项之一可以干净地编译,请使用它。这些选项是互斥的。

大多数其他编译器都可以理解 -Wall 等选项, -Wpedantic-Wextra-Wall 是必需的,其余的都是推荐的(请注意,尽管它的名字,-Wall 只启用最重要的警告,而不是全部其中)。这些选项可以单独使用,也可以一起使用。

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

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

编译器警告表明代码中存在潜在的严重问题。上面列出的问题几乎都是致命的;其他人可能会也可能不会,但您希望编译失败,即使结果是误报。调查每个警告,找到根本原因并修复它。如果出现误报,请解决它 - 即使用不同的语言功能或结构,以便不再触发警告。如果这被证明非常困难,请根据具体情况禁用该特定警告。

即使所有警告都是误报,您也不想只将警告保留为警告。对于非常小的项目来说,发出的警告总数少于 7 个,这可能没问题。如果超过 7 个,新的警告很容易在大量熟悉的旧警告中迷失。不允许这样做。只是让你的所有项目都能干净地编译。

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

如何将警告视为错误?

这也是通过编译器开关完成的。 /WX 用于 Microsoft,大多数其他人使用 -Werror。无论哪种情况,如果产生任何警告,编译都会失败。

这足够了吗?

可能不是!当您提高优化级别时,编译器开始越来越仔细地查看代码,这种更仔细的检查可能会发现更多错误。因此,不要满足于警告开关本身,在启用优化的情况下进行编译时始终使用它们(-O2-O3/O2 如果使用 MSVC)。

关于c++ - 为什么我应该始终启用编译器警告?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58496454/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com