c++ 如何使用clang-tidy为const-reference参数指定大小写?

nfeuvbwi  于 2023-08-09  发布在  其他
关注(0)|答案(1)|浏览(154)

a.cpp

#include <iostream>

void func(const int& a, const int b, int c) {
    std::cout << a + b + c << std::endl;
}

int main() {
    func(1, 2, 3);
    return 0;
}

字符串
我想用clang-tidy为参数ab指定大小写,而不是c。怎么办?
我还在llvm项目https://github.com/llvm/llvm-project/issues/64220上打开了一个问题,但也许这里有人有一个快速解决方案。
相关:https://clang.llvm.org/extra/clang-tidy/checks/readability/identifier-naming.html

clang-tidy -checks='readability-identifier-naming' -config="{CheckOptions: [ {key: readability-identifier-naming.ParameterCase, value: UPPER_CASE} ]}" a.cpp -- -std=c++17


捕获所有参数。

clang-tidy -checks='readability-identifier-naming' -config="{CheckOptions: [ {key: readability-identifier-naming.ConstantParameterCase, value: UPPER_CASE} ]}" a.cpp -- -std=c++17


仅捕获参数b,而不是a。我想同时捕获ab

clang-tidy --version
LLVM (http://llvm.org/):
  LLVM version 15.0.7
  Optimized build.
  Default target: x86_64-pc-linux-gnu
  Host CPU: skylake

gk7wooem

gk7wooem1#

为了总结这个请求,您需要一个名为readability-identifier-namingclang-tidy检查配置,它要求对const int &const int类型的参数使用大写字母,但不要求对int类型的参数使用大写字母。
在Clang+LLVM的当前版本16.0.6中,这是不可能的。ParameterCase选项适用于所有三个,而ConstantParameterCase选项仅适用于const int,而不是const int &,因为后者是对const限定类型的引用,但本身不是const限定的(引用类型不能是const限定的)。
没有比ParameterCase更具体的选项适用于const int &参数,可以从下面摘录的IdentifierNamingCheck::findStyleKind源代码中看出:

  • 参数始终是ParmVarDecl AST对象。
  • 它(const int &)既不是constexpr也不是const
  • 它不是参数包。
  • 它不是Type::isAnyPointerType(),就像C/C++指针和Objective-C指针一样,但不是引用。
  • 因此,唯一剩下的适用样式就是SK_Parameter,它对应于ParameterCase选项(用于字母大小写规则)。

当然,如果您的Issue #64220被执行,这在未来的版本中可能会改变。你可能想在这个问题上澄清一下,你(现在)明白这在当前版本中是不可能的,你正在提出增强请求。
源代码摘录:

StyleKind IdentifierNamingCheck::findStyleKind(
    const NamedDecl *D,
    ArrayRef<std::optional<IdentifierNamingCheck::NamingStyle>> NamingStyles,
    bool IgnoreMainLikeFunctions) const {
...
 if (const auto *Decl = dyn_cast<ParmVarDecl>(D)) {
    if (isParamInMainLikeFunction(*Decl, IgnoreMainLikeFunctions))
      return SK_Invalid;
    QualType Type = Decl->getType();

    if (Decl->isConstexpr() && NamingStyles[SK_ConstexprVariable])
      return SK_ConstexprVariable;

    if (!Type.isNull() && Type.isConstQualified()) {
      if (Type.getTypePtr()->isAnyPointerType() &&
          NamingStyles[SK_ConstantPointerParameter])
        return SK_ConstantPointerParameter;

      if (NamingStyles[SK_ConstantParameter])
        return SK_ConstantParameter;

      if (NamingStyles[SK_Constant])
        return SK_Constant;
    }

    if (Decl->isParameterPack() && NamingStyles[SK_ParameterPack])
      return SK_ParameterPack;

    if (!Type.isNull() && Type.getTypePtr()->isAnyPointerType() &&
        NamingStyles[SK_PointerParameter])
      return SK_PointerParameter;

    if (NamingStyles[SK_Parameter])
      return SK_Parameter;

    return SK_Invalid;
  }
...

字符串

相关问题