展开宏并检索宏值

Gan*_*dva 2 c++ python clang libclang

我试图使用libclang python绑定来解析我的c ++源文件.我无法获得宏的值或扩展宏.
这是我的示例c ++代码

#define FOO 6001
#define EXPAND_MACR \
        int \
        foo = 61
int main()
{
    EXPAND_MACR;
    cout <<  foo;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)


这是我的python脚本

import sys
import clang.cindex

def visit(node):
    if node.kind in (clang.cindex.CursorKind.MACRO_INSTANTIATION,   clang.cindex.CursorKind.MACRO_DEFINITION):           
    print 'Found %s Type %s DATA %s Extent %s [line=%s, col=%s]' % (node.displayname, node.kind, node.data, node.extent, node.location.line, node.location.column)
for c in node.get_children():
    visit(c)

if __name__ == '__main__':
    index = clang.cindex.Index.create()
    tu = index.parse(sys.argv[1], options=clang.cindex.TranslationUnit.PARSE_DETAILED_PROCESSING_RECORD)
    print 'Translation unit:', tu.spelling
    visit(tu.cursor)
Run Code Online (Sandbox Code Playgroud)


这是我从clang回来的信息:

Found FOO Type CursorKind.MACRO_DEFINITION DATA <clang.cindex.c_void_p_Array_3 object at 0x10b86d950> Extent <SourceRange start <SourceLocation file 'sample.cpp', line 4, column 9>, end <SourceLocation file 'sample.cpp', line 4, column 17>> [line=4, col=9]
Found EXPAND_MACR Type CursorKind.MACRO_DEFINITION DATA <clang.cindex.c_void_p_Array_3 object at 0x10b86d950> Extent <SourceRange start <SourceLocation file 'sample.cpp', line 6, column 9>, end <SourceLocation file 'sample.cpp', line 8, column 11>> [line=6, col=9]
Found EXPAND_MACR Type CursorKind.MACRO_INSTANTIATION DATA <clang.cindex.c_void_p_Array_3 object at 0x10b86d950> Extent <SourceRange start <SourceLocation file 'sample.cpp', line 12, column 2>, end <SourceLocation file 'sample.cpp', line 12, column 13>> [line=12, col=2]
Run Code Online (Sandbox Code Playgroud)


如果你观察我的python脚本,node.data会给出

DATA <clang.cindex.c_void_p_Array_3 object at 0x10b86d950>
Run Code Online (Sandbox Code Playgroud)


我可以读取clang返回的Extent数据,然后从开始结束位置解析文件以获取值.我想知道是否存在更好的获取宏值的方法?
我想直接获取宏的值(样本中为6001)(不使用Extent).我怎么能得到它?
另外对于EXPAND_MACR来说也是如此int foo = 61

我已经看过这些帖子:Link-1Link-2.
任何帮助将受到高度赞赏

And*_*ker 5

不,使用扩展区的逐行扩展似乎是提取(扩展宏)的唯一方法.

我怀疑的问题是,到时候libclang看到你的代码,宏已被删除预处理 - 你在AST看到节点更像是注释,而不是真正的节点.

#define FOO 6001
#define EXPAND_MACR \
        int \
        foo = 61
int main()
{
    EXPAND_MACR;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

真的是AST

TRANSLATION_UNIT sample.cpp
  +-- ...  *some nodes removed for brevity* 
  +--MACRO_DEFINITION FOO
  +--MACRO_DEFINITION EXPAND_MACR
  +--MACRO_INSTANTIATION EXPAND_MACR
  +--FUNCTION_DECL main
     +--COMPOUND_STMT 
        +--DECL_STMT 
        |  +--VAR_DECL foo
        |     +--INTEGER_LITERAL 
        +--RETURN_STMT 
           +--INTEGER_LITERAL 
Run Code Online (Sandbox Code Playgroud)

这相当于仅运行预处理器(并告诉它为您提供所有预处理器指令的列表).你可以通过运行看到类似的东西:

clang -E -Wp,-dD src.cc
Run Code Online (Sandbox Code Playgroud)

这使:

# 1 "<command line>" 1
# 1 "<built-in>" 2
# 1 "src.cc" 2
#define FOO 6001
#define EXPAND_MACR int foo = 61


int main()
{
    int foo = 61;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)