2012-05-07 13 views
6

tôi sử dụng Clang để xây dựng một AST từ C++ mã nguồn và RecursiveASTVisitor để đi qua cây.Quyết định trong Clang nếu CXXRecordDecl thăm là class, struct hoặc công đoàn

Tôi muốn quyết định tại bản khai báo cáo đã truy cập nếu đó là lớp, cấu trúc hoặc công đoàn. Tôi có chức năng bị ghi đè VisitCXXRecordDecl (clang :: CXXRecordDecl). Trong chức năng này tôi có thể check any information about CXXRecordDecl rằng lớp học cung cấp, nhưng tôi không có ý tưởng làm thế nào để có được thông tin thie.

Bất kỳ ai cũng có thể giúp tôi không?

Trả lời

8

Chỉ cần sử dụng isStruct, isClass, và isUnion chức năng thành viên, hoặc gọi getTagKind để có được một giá trị TagKind bạn có thể switch trên nếu bạn thích. Họ đang ở trong lớp cơ sở TagDecl.

2

Khi chạy, C++ không phân biệt giữa lớp và cấu trúc, và công đoàn chỉ có thể phân biệt được bởi thực tế là các thành viên dữ liệu của nó đều chia sẻ không gian địa chỉ. Vì vậy, cách duy nhất để thực hiện điều này là bao gồm dữ liệu meta trong định nghĩa lớp/struct/union của bạn hỗ trợ các phân biệt quan trọng đối với bạn. Ví dụ:

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

+0

Bạn có chắc chắn các công đoàn được phép có các chức năng của thành viên không? – RedX

+1

Từ tiêu chuẩn: 9.5.2: "Một liên minh có thể có các hàm thành viên (bao gồm các hàm tạo và hàm hủy), nhưng không phải các hàm ảo (10.3)." Tôi đã thử nghiệm mã ở trên và nó hoạt động. –