如何获取clang::CXXMethodDecl的访问限定符?
如何获取clang::CXXMethodDecl的访问限定符?
嘿,这个问题我写clang-tidy检查的时候也踩过坑!刚上手确实会纳闷——clang::CXXMethodDecl怎么没直接提供获取访问限定符的方法?其实是找错地方啦,它继承自clang::MemberDecl,这个父类里正好有你需要的方法。
你可以直接调用CXXMethodDecl对象的getAccessSpecifier()方法,它会返回clang::AccessSpecifier类型的枚举值,对应AS_public、AS_protected、AS_private这三种常见访问级别,还有AS_none这类特殊情况(比如类中未明确指定访问限定符时的默认值)。
给你举个实际用在clang-tidy检查里的代码例子:
#include "clang/AST/DeclCXX.h" #include "clang/ASTMatchers/ASTMatchFinder.h" // 假设这是你的检查回调函数 void YourCheck::check(const clang::ast_matchers::MatchFinder::MatchResult &Result) { if (const auto *Method = Result.Nodes.getNodeAs<clang::CXXMethodDecl>("targetMethod")) { clang::AccessSpecifier AccessLevel = Method->getAccessSpecifier(); switch (AccessLevel) { case clang::AS_public: // 处理public方法的逻辑 diag(Method->getLocation(), "这是一个public方法"); break; case clang::AS_protected: diag(Method->getLocation(), "这是一个protected方法"); break; case clang::AS_private: diag(Method->getLocation(), "这是一个private方法"); break; default: // 处理未指定访问级别的情况(比如类中默认的private) diag(Method->getLocation(), "访问级别未明确指定"); break; } } }
另外要注意,如果是继承来的方法,getAccessSpecifier()返回的是该方法在当前类中实际生效的访问级别——比如派生类把父类的protected方法改成public,这个方法会正确返回AS_public哦。
备注:内容来源于stack exchange,提问作者Benjamin Bihler
相关产品推荐
相关产品推荐

