6

Clangを使用してC++ソースコードからASTを構築し、RecursiveASTVisitorを使用してツリーをトラバースします。

訪問した記録宣言で、それがクラス、構造体、またはユニオンのいずれであるかを決定したいと思います。オーバーライドされた関数VisitCXXRecordDecl(clang :: CXXRecordDecl)があります。この関数では、クラスが提供するCXXRecordDeclに関する情報を確認できますが、この情報を取得する方法がわかりません。

誰か助けてもらえますか?

4

2 に答える 2

12

、、およびメンバ関数を使用するか、必要isStructに応じて値を取得するために呼び出します。彼らは基本クラスにいます。isClassisUniongetTagKindTagKindswitchTagDecl

于 2012-05-08T06:27:21.170 に答える
2

実行時に、C ++はクラスと構造体を区別せず、共用体は、そのデータメンバーがすべてアドレス空間を共有するという事実によってのみ区別できます。

したがって、これを実現する唯一の方法は、クラス/構造体/共用体の定義にメタデータを含めて、重要な区別をサポートすることです。例えば:

typedef enum { class_ct, struct_ct, union_ct } c_type;

class foo {
public:
    c_type whattype() { return class_ct; }
};

struct bar {
public:
    c_type whattype() { return struct_ct; }
};

union baz {
public:
    c_type whattype() { return union_ct; }
};

// B

于 2012-05-07T17:46:54.287 に答える