Currentlty我正在一个项目中,使用libclang转储c ++代码的类信息。关于类型限定符,还有一些痛苦的经验:const,volatile,&,&&&&及其组合。这是转储函数delearation的参数类型的示例代码。
auto _cur_cursor = one_node->get_cursor();
auto _cur_type = clang_getCursorType(_cur_cursor);
auto is_const = clang_isConstQualifiedType(_cur_type);
auto is_refer = clang_Type_getCXXRefQualifier(_cur_type);
auto is_volatile = clang_isVolatileQualifiedType(_cur_type);
auto is_pointer = clang_getPointeeType(_cur_type);
auto is_const_ref = false;
if (is_pointer.kind)
{
is_const_ref = clang_isConstQualifiedType(is_pointer);
}
the_logger.info("get parameter name {} type {} is_const {} is_reference {} is volatile {} is_pointer {} is_const_ref {}", utils::to_string(clang_getCursorSpelling(_cur_cursor)), utils::to_string(clang_getTypeSpelling(_cur_type)), is_const, is_refer, is_volatile, utils::to_string(is_pointer), is_const_ref);
我的测试用例在下面
int test_1(const std::vector<std::unordered_map<int, int>>& a, std::vector<int>&& b, std::vector<std::uint32_t>& c)
{
return b.size();
}
,此功能的输出为
[2019-06-01 23:14:18.171] [meta] [info] get parameter name a type const std::vector<std::unordered_map<int, int> > & is_const 0 is_reference 0 is volatile 0 is_pointer const std::vector<std::unordered_map<int, int> > is_const_ref true
[2019-06-01 23:14:18.171] [meta] [info] get parameter name b type std::vector<int> && is_const 0 is_reference 0 is volatile 0 is_pointer std::vector<int> is_const_ref false
[2019-06-01 23:14:18.171] [meta] [info] get parameter name c type std::vector<std::uint32_t> & is_const 0 is_reference 0 is volatile 0 is_pointer std::vector<std::uint32_t> is_const_ref false
这些观察对我来说是可疑的:
这些api似乎不符合预期。有什么想法可以为CXType获取正确的const引用volatile限定符状态?
答案 0 :(得分:1)
和3。const T (&, *, &&)
确实不是const
限定类型,它是const
限定类型的(引用,指针,r值引用)。 const T * const
是指向const
限定类型const
的{{1}}限定指针。
您可以检查cppreference了解更多详细信息。
来自libclang的documentation:
检索函数或方法的ref限定符类型。
为C ++函数或方法返回ref限定符。对于其他类型或非C ++声明,将返回CXRefQualifier_None。
可能您正在寻找其他东西。而是检查T
(在您的代码段中的CXType::kind
)中查找_cur_type.kind
,CXType_Pointer
和CXType_LValueReference
。
我希望这是有用的。用c高兴地黑客!