【问题标题】:What does the clang compiler's `-Weverything` option include and where is it documented?clang 编译器的 `-Weverything` 选项包括什么以及它记录在哪里?
【发布时间】:2021-01-16 17:21:48
【问题描述】:

clang,但不是 gcc,有一个 -Weverything 选项,似乎包含诸如 -Wpedantic 之类的东西。你可以在这里测试它:https://godbolt.org/z/qcYKd1。请参阅窗口的右上角,了解我在哪里输入了 -Weverything 作为显式编译器选项。

请注意我们收到的 -Wvla-extension 警告,因为在这种情况下我们依赖于 C++ 中的 C99 扩展,并且我们设置了 -Weverything。如果我们只使用-Wpedantic,我们会得到相同的警告,如下所示:https://godbolt.org/z/M9ahE4,表明-Weverything 实际上包含-Wpedantic

如果我们没有设置这些标志,我们会得到没有警告https://godbolt.org/z/j8sfsY

尽管 -Weverything 存在并在 clang 中工作,但是,我找不到任何关于它存在的文档,无论是在 clang 手册页还是在此处的在线手册中:https://clang.llvm.org/docs/DiagnosticsReference.html。也许我找错地方了?我对clang的手册不是很熟悉。

那么,-Weverything 包含哪些内容以及记录在哪里?

-Wall -Werror -Weverything 之类的操作似乎合乎逻辑,但我不知道这与仅-Wall -Werror 有何不同。

【问题讨论】:

    标签: c++ build clang compiler-flags


    【解决方案1】:

    混蛋!我刚刚找到了。

    主要clang文档索引页面的底部:https://clang.llvm.org/docs/index.html,在最底部的“索引和表格”部分下,有一个“搜索页面”链接。使用该链接,这是我对“-Weverything”的搜索:https://clang.llvm.org/docs/search.html?q=-Weverything,这将我带到这里的官方文档!:https://clang.llvm.org/docs/UsersManual.html?highlight=weverything#cmdoption-weverything。完毕!来了!

    另见:https://clang.llvm.org/docs/UsersManual.html?highlight=weverything#diagnostics-enable-everything

    以及我真正关心的部分(强调):

    由于-Weverything 启用所有诊断,我们通常不建议使用它。 -Wall -Wextra 是大多数项目的更好选择。 使用-Weverything 意味着更新编译器更加困难,因为您会接触到质量可能低于默认诊断的实验性诊断。如果您确实使用了-Weverything,那么我们建议您在添加到 Clang 时解决所有新的编译器诊断问题,方法是修复他们找到的所有内容,或者使用相应的 Wno- 选项显式禁用该诊断。

    所以,我的最终建议是使用 -Wall -Wextra 发出警告,但不要使用 -Weverything,个人而言,不要 -Wpedantic(或 -pedantic--同样的东西)因为我经常依赖 gcc 编译器扩展来进行低级嵌入式工作和以硬件为中心的编程,尤其是在微控制器上。

    我还强烈建议使用-Werror 将所有警告强制转换为错误。这对于需要永久运行的安全关键代码和/或嵌入式固件尤其重要,因为它会强制您修复所有警告以使代码完全编译。所以,我的最终建议是这样的,正如我在下面的 github 存储库中进一步描述的那样:

    # Apply "all" and "extra" warnings, and convert them all to errors
    # to force you to actually abide by them!
    -Wall -Wextra -Werror  
    

    您可以在我的 GitHub 存储库中阅读我对此主题的更全面的意见和研究:https://github.com/ElectricRCAircraftGuy/eRCaGuy_hello_world#build-notes

    补充说明:-Wpedantic == -pedantic

    在 gcc 中,它们是相同的:

    -Wpedantic
    -pedantic

    发出严格的 ISO C 和 ISO C++ 要求的所有警告...

    在 clang 中,它们在测试和文档方面似乎也是一样的。 Clang 还 strives to be gcc-compatible in their syntax and usage:“最终用户功能:”...“GCC 兼容性”。

    相关:

    1. Why should I always enable compiler warnings?

    【讨论】:

    • @JaMiT,关于您的第一条评论,它们是相同的。据我所知,gcc 和 clang 都将 -pedantic-Wpedantic 视为相同。请参阅 gcc 文档,例如:gcc.gnu.org/onlinedocs/gcc/Warning-Options.html。一个是另一个的别名。它们一起列出。关于第二条评论,我没有说清楚我知道我在说什么。我对-Werror 的使用是有意的——将所有警告强制转换为错误,并且我认识到它与警告无关,并且不包含任何警告。我会稍微更新一下答案以说明这一点。
    • 答案已更新。注意:我提到-Werror 的唯一原因是为了巩固我对自己和他人的最佳实践。这个答案是多年编程的结晶:最终基于研究、经验得出一个观点,并且,这个答案是我认为的最后一部分。不过,我只是被 clang 与 gcc 搞得一团糟,而且它(这里是 clang 的额外 -Weverything 选项)在我的理解中受到了影响,直到我找到了这个文档。
    • 通过 --> 扔
    • 好的,我不记得看到-Wpedantic 在使用中,但显然它是合适的。现在我的反对意见是,您 WAY 过于强调证明这两个选项是等价的。这很花哨,真的有损您的演示文稿。由于您想更改以解决我的(现已撤回)评论,因此所需要做的就是将“not -Wpedantic either”更改为“not @987654360 @(或-pedantic)或者”以确认这两个选项都存在。
    • 我不得不查一下“花哨”的意思。我不是故意这样说的。我只是在做我该做的事:我研究答案并写下结果。我认为这是有用的信息,并且不会影响要点。即使只是为了提醒自己将来这些细节和文档的位置,我也会留下它。但是,我认为其他人会发现这些额外的细节很有用,而不是花哨。
    猜你喜欢
    • 2021-03-15
    • 2021-07-01
    • 2019-12-23
    • 2012-11-17
    • 2011-11-25
    • 2022-10-01
    • 2014-06-01
    • 1970-01-01
    相关资源
    最近更新 更多