c++ - libclang 获取原始值

标签 c++ libclang

如何使用 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/

相关文章:

c++ - 使用套接字/内存而不是文件在 Cuda 中解码视频

c++ - 如何在 Gnu C++ (g++) 中使用十进制 float ?

c++ - 提高计算 1 到 2 之间的数字的 log2 的性能

python - 为什么这个python脚本找不到libclang dll?

c++ - 如何使用 clang API 解析函数指针的 typedef 以获取函数指针名称?

c++ - 为 libclang 全局设置 -D 宏编译器标志

C++ A星实现--判断节点是否已经在未清项优先队列中

c++ - 如何检索类 :function with clang

linux - OSError : libclangFrontend. so.5:无法打开共享对象文件:没有这样的文件或目录

如果在调试配置中编译 C++ hash_map.clear() 很慢