我目前正在使用clang C API为C ++代码构建解析器。解析器将处理头文件,并为其生成定义和缺少符号的列表(它会忽略include指令,因此将严格解析头的内容)。我的问题是,如果我有一个typedef表示一个函数指针,该指针采用未定义类型的参数,例如:

typedef SOME_TYPE (* funcPtrName)(SOME_UNDEF_TYPE x);


AST将SOME_TYPE解析为typedef而不是funcPtrName。如果将SOME_UNDEF_TYPE替换为int,它将正确解析funcPtrName

我以为可以使用clang_tokenize获取光标的所有标记并手动获取函数指针的名称,但是在指向typedef的光标上调用clang_getCursorExtent不能正常工作(返回的范围是0,0)。

您是否知道解决此问题的方法?

最佳答案

我确实设法解决了这个问题,方法是在翻译单元中建立所有标记的列表,然后将其传递给visitor函数。当我到达CXCursor_TypedefDecl光标时,我在令牌列表中搜索名称,然后检查下一个令牌是否为typedef。如果是这样,请期待(之后的第一个标记,它将是函数指针的名称。

这是一些示例代码:

   std::string symbol = clang_getCString(clang_getCursorSpelling(Cursor));

   ...

   case CXCursor_TypedefDecl:
   {
       auto finder = std::find(tokens.begin(), tokens.end(), symbol);
       if (*(finder + 1) == "(")
       {
           auto next = std::find(finder, parserData->tokens.end(), "*") + 1;
           symbol = *next;
       }
       symbolData[symbol] = SymbolInfo{ cursorKind, fileName };
   }

关于c++ - 如何使用clang API解析函数指针的typedef以获取函数指针名称?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24054433/

10-12 14:12
查看更多