考虑两个typedef
struct A { int member; };
typedef struct A TA;
typedef struct B { int b; } TB;
在这两个例子中,我们可以向libclang请求typedef的底层类型(使用clang_getTypedefDeclUnderlyingType(CXCursor)
),在这两个例子中,我们都得到一个kind为CXType_Elaborated
的CXType。
问:给定这些详细的类型节点,我如何区分声明(如struct A
)和定义(如struct B { int b; }
)?
可能相关的libclang函数如下:
CXType clang_Type_getNamedType(CXType)
CXCursor clang_getTypeDeclaration(CXType)
clang_Type_visitFields(CXType)
但是我还没有找到一种方法来区分这两种typedef,这种区分是相关的,以便能够以程序中编写的相同方式再次漂亮地打印typedef。
1条答案
按热度按时间r3i60tvu1#
根据cppreference(是的,它是C++,但我相信在C中也是一样的),前向声明是“详细类型说明符”的特例,因此
TA
的子节点是CXType_Elaborated
并不奇怪。在给定的翻译单元中没有定义的前向声明类型被称为“不透明类型”。看一下
CXTypeKind
,似乎没有办法区分(前向)重声明和typedef声明中的定义,这两者在抽象语法树中很可能是一样的。但是,您可以通过在typedef的子对象上调用
clang_isCursorDefinition
来实现您想要的结果。您也可以 checkoutclang_getCursorDefinition
来查找定义的位置。