首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >用libclang查找匿名枚举?

用libclang查找匿名枚举?

提问于 2018-02-02 08:18:02
回答 1关注 0查看 376

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

python绑定到libclang包含功能,以检测C/C++结构或联合是否是匿名的,使用clang.cindex.Cursor.is_anonymous,最后调用clang_Cursor_isAnonymous

下面的示例演示此问题。

代码语言:javascript
复制
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上运行时

代码语言:javascript
复制
enum
{
    VAL = 1
};

struct s
{
    struct {};
    union
    {
        int x;
        float y;
    };
};

给予:

代码语言:javascript
复制
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)')

回答

和开发者交流更多问题细节吧,去 写回答
相关文章

相似问题

相关问答用户
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档