gpt4 book ai didi

clang - 使用 libclang 获取原始(未扩展的)宏文本

转载 作者:行者123 更新时间:2023-12-03 23:49:25 25 4
gpt4 key购买 nike

使用 libclang,我在 AST 中有一个游标,它对应于宏扩展产生的语句。我想检索原始的、未扩展的宏文本。

我一直在寻找一个 libclang API 来执行此操作,但找不到。我错过了什么吗?

假设不存在这样的 API,我看到了几种方法来做到这一点,它们都基于使用 clang_getCursorExtent() 来获取光标的源范围——大概是原始文本的范围。

第一个想法是使用 clang_getFileLocation() 获取文件名和位置以及范围开始和结束,并直接从文件中读取文本。如果我是从未保存的文件编译的,那么我需要处理这个问题,但我对这种方法的主要担忧是,当我确定 clang 在内部保存所有这些信息时,似乎不适合到文件系统之外.如果 AST 已经加载而不是生成,或者源文件在解析后被修改,也会产生影响。

第二种方法是在游标范围上调用 clang_tokenize()。我尝试这样做,发现它无法为 AST 中的大多数游标生成 token 列表。跟踪代码,发现内部 clang_tokenize() 操作了提供的范围并最终得出结论它跨越多个文件(可能是由于宏扩展的某些影响),然后中止。这对我来说似乎不正确,但我确实觉得无论如何我都在滥用 clang_tokenize() 试图做到这一点。

那么,最好的方法是什么?

最佳答案

这是我找到的唯一方法。

因此,您可以使用 clang_getTranslationUnitCursor() 获得顶级光标.然后,你做 clang_visitChildren() ,将访问者函数传递到此返回 CXChildVisit_Continue以便只返回直系子级。在 child 中,您会看到顶级声明的常用游标类型(如 CXCursor_TypedefDeclCXCursor_EnumDecl ),但其中也有 CXCursor_MacroExpansion .每个宏扩展似乎都显示在具有这种类型的光标中。然后您可以调用clang_tokenize()在这些光标中的任何一个上,它都会为您提供未扩展的宏文本。

我不知道为什么宏扩展卡在 AST 的顶部附近,而不是在使用它们的元素中,这让事情变得非常尴尬。例子:

enum someEnum{
one = SOMEMACRO,
two,
three
}

如果 SOMEMACRO 的宏扩展光标在枚举声明中而不是它的兄弟,那就太好了。

(我意识到这已经很晚了,但我希望这能让 libclang 获得更多曝光,也许对它更有经验的人可以提供更多见解)。

关于clang - 使用 libclang 获取原始(未扩展的)宏文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16786767/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com