使用 libclang 查找匿名枚举
Finding anonymous enums with libclang
有没有办法使用 libclang 检测匿名枚举而不依赖于拼写名称中的文本?
libclang 的 python 绑定包括使用 clang.cindex.Cursor.is_anonymous 检测 C/C++ 结构或联合是否匿名的功能,最终调用clang_Cursor_isAnonymous。
以下示例演示了此问题。
import sys
from clang.cindex import *
def nodeinfo(n):
return (n.kind, n.is_anonymous(), n.spelling, n.type.spelling)
idx = Index.create()
# translation unit parsed correctly
tu = idx.parse(sys.argv[1], ['-std=c++11'])
assert(len(tu.diagnostics) == 0)
for n in tu.cursor.walk_preorder():
if n.kind == CursorKind.STRUCT_DECL and n.is_anonymous():
print nodeinfo(n)
if n.kind == CursorKind.UNION_DECL and n.is_anonymous():
print nodeinfo(n)
if n.kind == CursorKind.ENUM_DECL:
if n.is_anonymous():
print nodeinfo(n)
else:
print 'INCORRECT', nodeinfo(n)
在样品上运行时.cpp
enum
{
VAL = 1
};
struct s
{
struct {};
union
{
int x;
float y;
};
};
给:
INCORRECT (CursorKind.ENUM_DECL, False, '', '(anonymous enum at sample1.cpp:1:1)')
(CursorKind.STRUCT_DECL, True, '', 's::(anonymous struct at sample1.cpp:8:5)')
(CursorKind.UNION_DECL, True, '', 's::(anonymous union at sample1.cpp:9:5)')
不幸的是,
clang_Cursor_isAnonymous
仅适用于结构体和联合,正如您可以从tools/libclang/CXType中的clang源代码中看到的那样.cpp
unsigned clang_Cursor_isAnonymous(CXCursor C){
if (!clang_isDeclaration(C.kind))
return 0;
const Decl *D = cxcursor::getCursorDecl(C);
if (const RecordDecl *FD = dyn_cast_or_null<RecordDecl>(D))
return FD->isAnonymousStructOrUnion();
return 0;
}
因此,回退到 clang.cindex.Cursor.is_anonymous 中的conf.lib.clang_Cursor_isAnonymous
并不是什么新东西,因为游标类型已经针对FIELD_DECL进行了检查(这仅适用于结构和联合)
def is_anonymous(self):
"""
Check if the record is anonymous.
"""
if self.kind == CursorKind.FIELD_DECL:
return self.type.get_declaration().is_anonymous()
return conf.lib.clang_Cursor_isAnonymous(self)
您可以尝试提取当前元素的标识符(示例中的 n)并检查它是否存在或为 null
相关文章:
- 不带大括号的枚举形式
- 枚举环境变量的惯用C++14/C++17方法
- 类似枚举的计算常量
- 如何正确实现和访问运算符的各种自定义枚举器
- 错误:从"int"到枚举c++的转换无效
- C++中构造函数中的枚举
- 访问在 C++ 结构中声明的枚举变量
- 枚举类'classname'的多重定义
- 强枚举类型定义:Clang Bug 还是 C++11 标准不确定性?
- typedef 枚举和枚举类有什么区别?
- 为什么我的开关/机箱在使用枚举时默认?
- 标准::可选枚举的比较运算符
- C++两个源文件之间共享的枚举的静态实例
- 打印没有铸件的枚举可以在C++中吗?
- 枚举成员与静态 int 成员?
- C++:枚举:错误:应使用标识符而不是"}"
- 带有 c++ 的枚举(输入检查)
- 自动生成枚举查找表
- 使用 libclang 查找匿名枚举
- 在枚举的向量中查找