如何利用libclang区分typedef化结构体的声明与定义?
如何通过libclang区分typedef中引用的结构体声明与定义?
先看示例代码:
struct A { int member; }; typedef struct A TA; typedef struct B { int b; } TB;
调用clang_getTypedefDeclUnderlyingType(CXCursor)获取两个typedef的底层类型时,得到的都是CXType_Elaborated类型的CXType。要区分这两种场景(引用已定义的结构体、在typedef内定义结构体),可以按以下步骤操作:
步骤1:提取命名类型
对CXType_Elaborated类型调用clang_Type_getNamedType(),得到对应的结构体命名类型(CXType_Struct)。
步骤2:获取结构体的声明游标
将得到的结构体类型传入clang_getTypeDeclaration(),获取该结构体对应的CXCursor。
步骤3:通过位置对比区分场景
对比typedef自身游标和结构体声明游标的源位置,即可区分两种情况:
- 获取typedef游标的位置:
clang_getCursorLocation(typedef_cursor) - 获取结构体声明游标的位置:
clang_getCursorLocation(struct_cursor) - 若两个位置相同,说明结构体是在typedef语句内部定义的(对应
typedef struct B { int b; } TB;) - 若位置不同,说明typedef引用的是之前已声明/定义的结构体(对应
typedef struct A TA;)
补充:字段遍历辅助验证
如果需要进一步确认结构体是否包含完整定义,可以调用clang_Type_visitFields()遍历结构体字段——示例中两种情况的结构体都有完整定义,均可遍历到对应字段,但结合位置判断就能明确是内部定义还是外部引用。
内容的提问来源于stack exchange,提问作者A.J.Rouvoet
相关产品推荐
相关产品推荐

