Skip to content

Commit

Permalink
docs: 补充对抑制警告的解释
Browse files Browse the repository at this point in the history
  • Loading branch information
FeignClaims committed Oct 23, 2024
1 parent 5b5dfd9 commit 31c8767
Show file tree
Hide file tree
Showing 3 changed files with 61 additions and 1 deletion.
62 changes: 61 additions & 1 deletion appendix/about_warnings/main.rst
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,22 @@
删除线
删除线由 clangd 的 clang-tidy 部分检查产生. 它不会让代码无法编译, 但说明你的代码不满足在 .clang-tidy 文件中设定的代码风格规范.

在除了 ``Error Lens`` 插件所提供的代码中显示简单诊断信息, 我们还可以通过 :menuselection:`问题` 面板和 :KBD:`鼠标悬停` 在诊断划线位置, 来了解更多信息:

.. tabs::

.. tab:: 问题面板

如果没有显示出面板, 你可以通过 :KBD:`Ctrl` + :KBD:`J` 或 :KBD:`Command⌘` + :KBD:`J` 打开.

.. figure:: 问题面板.png

.. tab:: 鼠标悬停

你也可以用快捷键打开光标位置的悬停提示 (editor.action.showHover), 但这默认快捷键很复杂, 建议查询并修改快捷键.

.. figure:: 鼠标悬停.png

========================================================================================================================
编译器产生的警告
========================================================================================================================
Expand All @@ -21,7 +37,7 @@
将“参数未使用”警告提示为错误

------------------------------------------------------------------------------------------------------------------------
抑制这类警告的方法
别看: 抑制这类警告的方法
------------------------------------------------------------------------------------------------------------------------

根据编译器不同使用的方法可能有差异, 可以参考第三方单元测试框架的代码, 其中一般会有抑制警告相关的部分. 以 Clang 为例:
Expand Down Expand Up @@ -99,6 +115,50 @@ clang-tidy 产生的警告
``// NOLINT(*explicit*)``
抑制所有包含 ``explicit`` 的警告.

------------------------------------------------------------------------------------------------------------------------
不要滥用抑制警告
------------------------------------------------------------------------------------------------------------------------

**请不要滥用抑制警告!**

学习模板在配置时已经禁用了很多严格的警告, 而留下来的警告通常对初学者会有帮助. (当然, 我必须照顾在不同学习阶段的人, 因此有的警告你现在确实看不懂.)

我在答疑过程中经常看见有人用 ``// NOLINTBEGIN`` 和 ``// NOLINTEND`` 禁用了整个源代码中的 clang-tidy 警告, 然后问代码出了什么问题, 结果代码出的问题恰恰就是他所禁用的警告所要警告的 (**甚至能自动修复的!**).

抑制警告不是说忽略那个警告, 而是编写者对软件、人 (可能是几天后的你自己!) 说: "我已经看到了那个警告并思考过了, 我认为我的代码没有问题, **并愿意为此负责**."

例如, 新手常见的一个错误是, 将 :cpp:`==` 写成了 :cpp:`=`, 而 clang-tidy 完全能检测出来, 用警告询问你这样做是不是你想要的!

.. code-block:: cpp
:linenos:
:emphasize-lines: 5
int main() {
int value = 0;
cin >> value;
if (value = 5) { // warning: Using the result of an assignment as a condition without parentheses (fixes available)
// ...
}
}
所以, 我建议在抑制警告时, 一定要写明具体要禁用什么警告:

.. code-block:: cpp
:linenos:
:emphasize-lines: 5-6
int main() {
int value = 0;
cin >> value;
// ↓ 我知道我在下一行 if 里写了个 = 而不是 ==, 谢谢你的关心, 但这就是我想要的
// NOLINTNEXTLINE(*assignment-in-if*)
if (value = 5) {
// ...
}
}
------------------------------------------------------------------------------------------------------------------------
参考文献
------------------------------------------------------------------------------------------------------------------------
Expand Down
Binary file added appendix/about_warnings/问题面板.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added appendix/about_warnings/鼠标悬停.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.

0 comments on commit 31c8767

Please sign in to comment.