gpt4 book ai didi

python - 使用 libclang 查找匿名枚举

转载 作者:IT老高 更新时间:2023-10-28 20:55:54 26 4
gpt4 key购买 nike

有没有办法使用 libclang 检测匿名枚举而不依赖拼写名称中的文本?

python 绑定(bind)到 libclang包括使用 clang.cindex.Cursor.is_anonymous 检测 C/C++ 结构或 union 是否匿名的功能, 最终调用 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)

在 sample.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 仅适用于结构和 union ,正如您在 tools/libclang/CXType.cpp 中的 clang 源代码中看到的那样

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 进行了检查(这仅适用于结构和 union )

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)并检查它是否存在或为空

关于python - 使用 libclang 查找匿名枚举,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35113197/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com