我想在下面的例子中解析类成员函数的广义属性:
class Foo
{
public:
void foo [[interesting]] ();
void bar ();
};
使用 libclang C API,我想区分 foo
和 bar
(并且知道 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/