【问题标题】:Using clang-tidy to check c++17 code使用 clang-tidy 检查 c++17 代码
【发布时间】:2018-07-02 10:11:22
【问题描述】:

我在 Ubuntu 上安装了 clang-tidy,使用:

sudo apt install clang-tidy

我在一个简单的 C++ 17 文件上运行它,得到了警告和错误:

/home/erelsgl/Dropbox/ariel/CPLUSPLUS/intro/01-single-file/ptr.cpp:17:3: warning: 'auto' type specifier is a C++11 extension [clang-diagnostic-c++11-extensions]
                auto i = make_unique<int>();
                ^
/home/erelsgl/Dropbox/ariel/CPLUSPLUS/intro/01-single-file/ptr.cpp:17:12: error: use of undeclared identifier 'make_unique' [clang-diagnostic-error]
                auto i = make_unique<int>();

如何告诉 clang-tidy 根据 c++17 标准检查这个文件?

注意:要构建程序,我运行:

clang++-5.0 --std=c++17 ptr.cpp

【问题讨论】:

  • 也许试试 -std=c++17。如果没有工作,请尝试 -std=c++1z。
  • 你读过docs吗?

标签: c++ c++17 clang-tidy


【解决方案1】:

根据您的编译器/clang-tidy 版本,用于编译源文件的默认 C++ 标准版本可能会有所不同。 clang 的默认 std 版本是 gnu++-98(或从 clang 6.0 开始的 gnu++-14),并且通常 clang-tidy 具有与 clang 相同的默认值。

我猜-std=c++17(或-std=c++1z)没有在C++编译器标志中指定,用于编译ptr.cpp,所以clang-tidy回退到默认的-std=gnu++98,因此给出C++11 代码的警告。

要让 clang-tidy 处理 C++17,您应该按照 @n.m. 的建议指定 -std 标志,作为 -extra-arg 选项的参数,例如:

clang-tidy -p . ptr.cpp -extra-arg=-std=c++17

编辑:

由于clang++-5.0用于编译ptr.cpp,所以最好使用匹配的clang-tidy版本5.0(在Ubuntu 16.04上,通过apt安装的默认clang-tidy版本是3.8),即是:

clang-tidy-5.0 -p . ptr.cpp -extra-arg=-std=c++17

如果尚未安装,您可以从以下地址获取它:
https://www.ubuntuupdates.org/package/xorg-edgers/xenial/main/base/clang-tidy-5.0

【讨论】:

  • 我试过 'clang-tidy -p 。 ptr.cpp -extra-arg="--std=c++17"' 并尝试了 'clang-tidy -p 。 ptr.cpp -extra-arg="--std=c++1z"' 并尝试了 'clang-tidy -p 。 ptr.cpp -extra-arg=c++17' 并尝试了 'clang-tidy -p 。 ptr.cpp -extra-arg=c++1z',但我仍然得到很多错误。例如,我得到:“/usr/lib/gcc/x86_64-linux-gnu/7.1.0/../../../../include/c++/7.1.0/type_traits:177:5:错误:“内联”只能出现在函数 [clang-diagnostic-error]”上。
  • 注意:要构建程序,我运行“clang++-5.0 --std=c++17 ptr.cpp”。它运行没有错误。可能 clang-tidy 没有找到 clang++-5.0?
  • @ErelSegal-Halevi 如果您使用的是 clang++-5.0,使用 clang-tidy-5.0 可能会更好 - 我建议明确运行 clang-tidy-5.0(Ubuntu 16.04 的默认 clang-tidy是3.8,所以它可能是被选中的那个)。一般来说 clang 和 clang-tidy 是相互独立的(尽管它们共享一些库)。
  • @ErelSegal-Halevi 你可以从这里选择 clang-tidy-5.0:ubuntuupdates.org/package/xorg-edgers/xenial/main/base/…
  • 这解决了问题!我使用:'''clang-tidy-5.0 -extra-arg="--std=c++17" ptr.cpp'''
猜你喜欢
  • 2021-01-05
  • 2016-02-18
  • 2016-10-23
  • 1970-01-01
  • 2017-01-05
  • 1970-01-01
  • 1970-01-01
  • 2020-07-20
  • 2020-04-08
相关资源
最近更新 更多