libclang:区分typedefed结构声明与typedefed结构定义

7y4bm7vi  于 2022-12-03  发布在  其他
关注(0)|答案(1)|浏览(212)

考虑两个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。

r3i60tvu

r3i60tvu1#

根据cppreference(是的,它是C++,但我相信在C中也是一样的),前向声明是“详细类型说明符”的特例,因此TA的子节点是CXType_Elaborated并不奇怪。在给定的翻译单元中没有定义的前向声明类型被称为“不透明类型”。
看一下CXTypeKind,似乎没有办法区分(前向)重声明和typedef声明中的定义,这两者在抽象语法树中很可能是一样的。
但是,您可以通过在typedef的子对象上调用clang_isCursorDefinition来实现您想要的结果。您也可以 checkout clang_getCursorDefinition来查找定义的位置。

相关问题