如何使用Python从C++标题检索类名及其方法名

2024-06-07 11:51:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用Python中的CLAN模块解析C++头文件。我试图列出所有类名及其成员函数。你知道吗

这是我试过的

我在下面发现了这个 https://stackoverflow.com/a/40328378/6223628

import clang
import clang.cindex as cl
from clang.cindex import CursorKind

def fully_qualified(c):
    if c is None:
        return ''
    elif c.kind == CursorKind.TRANSLATION_UNIT:
        return ''
    else:
        res = fully_qualified(c.semantic_parent)
        if res != '':
            return res + '::' + c.spelling
    return c.spelling

cl.Config.set_library_file('C:/Program Files/LLVM/bin/libclang.dll')
idx = clang.cindex.Index.create()
tu = idx.parse('C:/Repository/myproject/myHeader.h', args='-xc++ --std=c++11'.split())
for c in tu.cursor.walk_preorder():
    if c.kind == CursorKind.CALL_EXPR:
        print (fully_qualified(c.referenced))

我只能检索一些类名,其余的或结果来自std名称空间。你知道吗

还有其他选择吗?你知道吗


Tags: importreturnifclresclangkindidx
1条回答
网友
1楼 · 发布于 2024-06-07 11:51:14

根据注释中@Predelnik的提示,我将CursorKind调整为类decl和CXX\u方法,并获得了所需的。你知道吗

import clang
import clang.cindex as cl
from clang.cindex import CursorKind

def fully_qualified(c):
    if c is None:
        return ''
    elif c.kind == CursorKind.TRANSLATION_UNIT:
        return ''
    else:
        res = fully_qualified(c.semantic_parent)
        if res != '': 
            if res.startswith("myWord"):
                return res+"::"+c.spelling
        return c.spelling 

cl.Config.set_library_file('C:/Program Files/LLVM/bin/libclang.dll')
idx = clang.cindex.Index.create()
tu = idx.parse('C:/myproject/myHeader.h', args='-xc++  std=c++11'.split())
for c in tu.cursor.walk_preorder():
    if c.kind == CursorKind.CLASS_DECL:
        print(fully_qualified(c.referenced))
    elif c.kind == CursorKind.CXX_METHOD:
        print(fully_qualified(c.referenced))

相关问题 更多 >

    热门问题