c++ - 使用 libclang 检查通用属性

标签 c++ clang abstract-syntax-tree libclang

我想在下面的例子中解析类成员函数的广义属性:

class Foo
{
public:
    void foo [[interesting]] ();
    void bar ();
};

使用 libclang C API,我想区分 foobar(并且知道 foo有趣的 属性)在源代码中。这可能吗?我很难找到解释 API 中使用的概念的示例或文档(我找到了一个引用,但如果没有解释这些概念,则很难使用)。

最佳答案

虽然我无法在 AST 中找到通用属性(似乎它们在构建 AST 时或之前被删除,而不是在构建 AST 之后),但我确实找到了解决方法。

有一个annotate clang 属性,格式如下:

__attribute__((annotate("something")))

使用宏我可以获得合理的语法和在 AST 中可见的注释:

#define INTERESTING __attribute__((annotate("interesting")))

class Foo
{
public:
    INTERESTING void foo();
    void bar();
};

属性将是方法节点的子节点,其显示名称是注释字符串。可能的 AST 转储:

 <CursorKind.TRANSLATION_UNIT>
  "test.h"
{
  __builtin_va_list <CursorKind.TYPEDEF_DECL>
    "__builtin_va_list"
  type_info <CursorKind.CLASS_DECL>
    "type_info"
  Foo <CursorKind.CLASS_DECL>
    "Foo"
  {
     <CursorKind.CXX_ACCESS_SPEC_DECL>
      ""
    foo <CursorKind.CXX_METHOD>
      "foo()"
    {
       <CursorKind.ANNOTATE_ATTR>
        "interesting"
    }
    bar <CursorKind.CXX_METHOD>
      "bar()"
  }
}

它也产生与 void foo INTERESTING (); 相同的输出。

关于c++ - 使用 libclang 检查通用属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19653767/

相关文章:

c# - RegisterPointerInputTarget() 函数给出 false

c++ - 是否可以通过 clang 和 gcc 支持构建 boost?

c++ - 使用 TMP 预计算值何时真正有用?

c++ - 如果类类型已知,是否使用虚拟分派(dispatch)?

Ada短路控制表

compiler-construction - 如何在 OCaml 编译器中遍历类型化抽象语法树

c++ - 此 C++ 代码示例中是否存在关于指针的内存泄漏?

c++ - MSVC 是否应该拒绝没有实例化的模板化使用

c - 在没有双重评估的情况下在 Clang 中实现 min() 和 max()

python - 将一行 Python 代码分成几部分