如何使用 libclang 获取原始文字的值?
例如,如果我有一个游标类型为 CXCursor_IntegerLiteral 的 CXCursor,我该如何提取文字值。
更新:
我在使用 libclang 时遇到了很多问题。我强烈建议完全避免使用它,而是使用 clang 提供的 C++ 接口(interface)。 C++ 接口(interface)非常有用并且有很好的文档记录:http://clang.llvm.org/doxygen/annotated.html
我现在看到 libclang 的唯一目的是为您生成 ASTUnit 对象,就像下面的代码一样(否则并不容易):
ASTUnit * astUnit;
{
index = clang_createIndex(0, 0);
tu = clang_parseTranslationUnit(
index, 0,
clangArgs, nClangArgs,
0, 0, CXTranslationUnit_None
);
astUnit = static_cast<ASTUnit *>(tu->TUData);
}
现在您可能会说 libclang 是稳定的,而 C++ 接口(interface)不是。这无关紧要,因为你花在用 libclang 弄清楚 AST 和用它创建 kludges 上的时间无论如何都会浪费你很多时间。我会尽快花几个小时修复在版本升级后无法编译的代码(如果需要的话)。
最佳答案
无需重新解析原文,您已经在翻译单元中获得了所需的所有信息:
if (kind == CXCursor_IntegerLiteral)
{
CXSourceRange range = clang_getCursorExtent(cursor);
CXToken *tokens = 0;
unsigned int nTokens = 0;
clang_tokenize(tu, range, &tokens, &nTokens);
for (unsigned int i = 0; i < nTokens; i++)
{
CXString spelling = clang_getTokenSpelling(tu, tokens[i]);
printf("token = %s\n", clang_getCString(spelling));
clang_disposeString(spelling);
}
clang_disposeTokens(tu, tokens, nTokens);
}
您会看到第一个标记是整数本身,下一个是不相关的(例如,它是 ;
for int i = 42;
。
关于c++ - libclang 获取原始值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10692015/