我目前正在使用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/